hachiNote

勉強したことをメモします。

rubyzipを使って圧縮ファイルを作成する

目的

自分がこっそり作っているプロダクトで、写真をまとめて1つのzipファイルにしてダウンロードできるようにしたかったので、Rails上で圧縮ファイルが作れる方法を探してみました。

するとrubyzipが定番ぽかったので、これを使ってみたときにつまづいた点を記録しておきます。

rubyzip

これです。
https://github.com/rubyzip/rubyzip

Railsで使う場合は、 Gemfile に追加して bundle install すればいいだけですね。

つまづいたところ

NameErrorが出る

以下のようなエラーが表示される。

NameError (uninitialized constant BasketsController::Zip):
  app/controllers/baskets_controller.rb:12:in `download'

こちらが参考になりました。
ruby on rails - rubyzip - cannot load such file -- zip - Stack Overflow

こう書いて解決しました。

gem 'rubyzip', '>= 1.0.0', require: 'zip'

RailsだとGemfileにrequireを書くんですかねぇ?

すでに古いrubyzipが入っていた

私が作ったプロダクトにはすでにrubyzipが入っていましたが、そもそもRailsをnewしたのがずいぶん前のせいなのか、rubyzipのバージョンが0.9系でした。このバージョンだとrubyzipのインターフェースが違うみたいなのでupdateしたいところです。

$ bundle update rubyzip

と打つと個別のモジュールをupdateできるみたいです。

ZipErrorになる

私の場合、zipファイルをtempディレクトリに置きたかったので、Tempfileモジュールを使って先にファイルを作って、そこにzipファイルを上書きしたいと思っていました。

しかしこのやり方だと、以下のようなエラーがでました。

Zip::ZipError (Zip end of central directory signature not found):
  app/controllers/baskets_controller.rb:13:in `download'

ここを参考にして解決しました。

Create a temporary zip file to send as response in Rails | Think In Geek

正直よくわかってないので、まるっと参考にさせてもらいました。