ファイル達を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はあるでしょ。あって欲しい。