zip ruby には buffer モードが有る。
zipruby をそのまま使うと、一時ファイルを作って出力先にzip を用意しなくちゃいけないので、tmpfile などと組み合わせる必要がるけど、変数だけでメモリ内部でぱぱっと作れないのか調べた。
ruby-zip-in-memory-sample.rb
#!/usr/bin/env ruby # require 'zipruby' zip_bin = '' # ここにzipのバイナリが入ってくる Zip::Archive.open_buffer(zip_bin){|ar| ar.add_buffer('sample.txt', "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n") } ## 確認用にファイルに書き出す。 open('out.zip','w'){|f| f.write zip_bin }
実際に使ってみる
実行すると無事に zip ファイルが生成される。
takuya@~/Desktop/$ ruby ruby-zip-in-memory-sample.rb takuya@~/Desktop/$ ll -rw-r--r-- 1 takuya staff 123 2016-09-26 01:20 out.zip -rw-r--r-- 1 takuya staff 206 2016-09-26 01:20 ruby-zip-in-memory-sample.rb
ちゃんとzip が出来ているか確認する。
takuya@~/Desktop/$ lsar out.zip out.zip: Zip sample.txt
展開して中身を確認
takuya@~/Desktop/$ unar out.zip out.zip: Zip sample.txt (30 B)... OK. Successfully extracted to "./sample.txt". takuya@~/Desktop/$ cat sample.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ファイルを使わずにzip アーカイブを作れることがわかった。
zip アーカイブを作ってresponseするのに毎回ファイルに書いているのもダルいしね。ウッかりとファイルが残ってしまうのも嫌だし。