rubyでZIPファイルを扱う場合のgemといえば、現在のところrubyzip一択のようですが、一旦ディスクに落としてから展開するパターンが多くて、中のデータさえ拾ってしまえばダウンロードしたZIPは必要ない状況では、処理が美しくないと思ったので、メモ。
https://github.com/rubyzip/rubyzip
詳細な情報が欲しい場合は、rdocを参照すると良いです。
両方英語ですが、コードを読めば言わんとしているところは分かると思います。
bundle経由でインストールする場合は、Gemfileファイルをいじってください。
ネットワーク越しにZIPファイルを取得するので、openメソッドを拡張するopen-uriも用意しておきます。
なんかディレクトリを潜っていく処理をかましていない気がするので、過信は禁物です。
rubyzipのgithub
とりあえず使う場合は、githubに書いてある内容だけで、なんとなく圧縮・展開はできると思います。https://github.com/rubyzip/rubyzip
詳細な情報が欲しい場合は、rdocを参照すると良いです。
両方英語ですが、コードを読めば言わんとしているところは分かると思います。
事前準備
まずはrubyzipをgem経由でインストールします。gem install rubyzip
bundle経由でインストールする場合は、Gemfileファイルをいじってください。
ネットワーク越しにZIPファイルを取得するので、openメソッドを拡張するopen-uriも用意しておきます。
やってみる
手順は簡単。- まずはopenメソッドでZIPファイルを取得
- 取得したZIPはファイルに落とさず、Zip::File.open_bufferメソッドでバッファから直接ZIPファイルを展開
- eachで回して全件取得
require "open-uri"
require "zip"
file_url = "http://example.com/じっぷふぁいる.zip"
open(URI.escape(file_url)) do |file|
Zip::File.open_buffer(file.read) do |zf|
zf.each do |entry|
p entry.name # ファイル名
p entry.get_input_stream.read # ファイルの中身
end
end
end
なんかディレクトリを潜っていく処理をかましていない気がするので、過信は禁物です。
初めまして!
返信削除RiKiと申します。
フォルダの中にさらにフォルダがある場合の展開が出来なくて
行き詰っております。
何かアドバイスをいただけないでしょうか?