それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

zipruby でファイルを経由せずに変数内だけでzip ファイルを作る

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するのに毎回ファイルに書いているのもダルいしね。ウッかりとファイルが残ってしまうのも嫌だし。

参考資料

http://www.rubydoc.info/gems/zipruby/0.3.6