RubyonRailsでファイルI/Oを走らせずにCSVを作成、圧縮してダウンロードさせる方法

長いタイトルですな。

つまり、サーバ上でファイルを作って圧縮、ダウンロードは結構簡単にできるんです。ただ、ファイル生成しちゃうとファイル名をユニークにしなきゃいけなかったり、ファイルのダウンロードが終わったら削除しなきゃいけなかったり、気分的に手間なんですよね。タイミングによってはダウンロードが開始される前に削除されちゃったりして、びっくりでした。

で、オンメモリでCSVファイル作って圧縮、ダウンロードまでしてみました。まぁメモリが安くなったからこそできる技ですよね。CSVが小さければいいけど、昔はこんなこと怖くてできなかった。

require ‘rubygems’
require ‘zipruby’

data = “a,b,crnA,B,C”
Zip::Archive.open_buffer(buffer, Zip::CREATE) do |arc|
  arc.add_buffer(“download.csv”,data)
end

send_data(buffer , :type=>’application/zip’, :filename => “download.zip”, :disposition=>’attached’)

オンメモリでCSVちゅーのはどうでもよくて、ポイントはZip::Archiveのadd_bufferでしょう。ziprubyのバージョンにもよりけりなのかもしれません。今回利用したのは0.2.9です。あとはsend_fileじゃなくてsend_dataを使うあたりですかね。