ファイル達をtar.gzしてダウンロードさせる
とりあえず動くけどいろいろダメだと思う
Postのidsにモデルのidが" "で区切られて送られてくる。idsでモデルの集合を取得している。モデルのpathに実際のファイルパスが入っているので
1.ファイルをtmpdir作ってcpする 2.tmpファイル作って(別に作らなくてもユニークなパス文字列作れればOKな気がする。)system関数でtar -czfする 3.パスをsend_fileする。
でうごいた。
動いたけどなんかうえんすぎる気がする。
application/○○で何が適切なのかわからない。gzipって本当に正しいのか???妄想で書いてる。tmpfile/tmpdirがどのタイミングでファイル消えるのか調べてない。ゴミがたまり続ける気もする。
post "/api/gzip" do begin require "tmpdir" ids = params[:qs].split(' ') rets = Musicmodel.where(:_id.in => ids) path = nil tmp = Tempfile.open(["music_pack_",'.tar.gz'],'/tmp') do |io| path = io.path end Dir.mktmpdir do |dir| seri = 0 rets.each do |music| # musicのpathに実際の格納場所がセットされている。 filename = "p#{seri}_#{File.basename(music.path)}" seri = seri + 1 FileUtils.cp(music.path, "#{dir}/#{filename}") end system "tar -czf #{path} #{dir}" end content_type 'application/gzip' send_file path ,:filename => 'musicdb_pack.tar.gz' rescue => ex ex.to_s end end
あとはアクセス制限つけて終了。
ok_ipは俺俺関数
unless ok_ip? throw(:halt, [403, "Sorry,Your IP(#{get_ip}) is not permitted.\n"]) end
tarコマンド使えないと全く使いものにならないが、tarはあるでしょ。あって欲しい。