ボタンをクリックした際 Rails 上で大量のファイルをまとめてZIPをダウンロードさせたいのですが
https://qiita.com/tochi/items/42c12ec5026f13a74a4c
のようにziplineというジェムを使った記事がいくつかでてくるのですが
https://teratail.com/questions/152629
で質問したように Rails 4.2.3 を使ってる現システムではジェムのインストールに失敗してしまいます
他にも rubyzip というジェムを使うと加えるファイル自体はストリームで入力できるみたいですが
最終的に完成するZIPファイルは最後までメモリ上におかないとだめみたいで…
Rails 4 上でメモリに全て展開せずにストリームでZIPを作成する方法はないでしょうか
よろしくおねがいします
追記:
Rails 自体にはストリームで出力を返す方法がいくつかあるみたいです
include ActionController::Live
をつかうとか
render stream
をつかうとか
なのでZIPファイルを作るときにファイル単位で途中を取り出すことができれば実現はできそうなのです
ためしたこと:
ZIPを扱うのはrubyzipを使った記事が多いのですが
だいたい以下のようなサンプルになってます(あるいは CreatFileをつかったもの)
buffer = Zip::OutputStream.write_buffer(::StringIO.new('')) do |out| out.put_next_entry("file1") out.write "data1" # ここで file1 の分だけのデータを取り出したい out.put_next_entry("file2") out.write "data2" end puts buffer.string # ここで全部出力
Zip::OutputStreamのドキュメントによると
write_buffer(io = ::StringIO.new(''), encrypter = nil) {|zos| ... } ⇒ Object
write_buffer の引数に出力先の StringIO があるので
これからどうにか途中のデータを取り出すことができれば実現できそうな気がするのですが
require 'zip' require "stringio" io = StringIO.new('') buffer = Zip::OutputStream.write_buffer(io) do |out| out.put_next_entry("file1") out.write "data1" puts io.read io.rewind out.put_next_entry("file2") out.write "data2" end
等としても何も出力されません
あなたの回答
tips
プレビュー