2015/05/07

[ruby] rubyzipを使ってダウンロードしたZIPを保存せずにデータを拾う

rubyでZIPファイルを扱う場合のgemといえば、現在のところrubyzip一択のようですが、一旦ディスクに落としてから展開するパターンが多くて、中のデータさえ拾ってしまえばダウンロードしたZIPは必要ない状況では、処理が美しくないと思ったので、メモ。




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

なんかディレクトリを潜っていく処理をかましていない気がするので、過信は禁物です。


1 件のコメント:

  1. 初めまして!
    RiKiと申します。

    フォルダの中にさらにフォルダがある場合の展開が出来なくて
    行き詰っております。

    何かアドバイスをいただけないでしょうか?

    返信削除