4

Sinatra の組み込みコマンドを使用しようとしてsend_fileいますが、一時ファイルに対しては機能していないようです。

私は基本的に、mp3 のアルバムを圧縮するために次のことを行います。

get '/example' do
  songs = ...
  file_name = "zip_test.zip"
  t = Tempfile.new(['temp_zip', '.zip'])
  # t = File.new("testfile.zip", "w")
  Zip::ZipOutputStream.open(t.path) do |z|
    songs.each do |song|
      name = song.name
      name += ".mp3" unless name.end_with?(".mp3")
      z.put_next_entry(name)
      z.print(open(song.url) {|f| f.read })
      p song.name + ' added to file'
    end
  end
  p t.path
  p t.size

  send_file t.path, :type => 'application/zip',
                         :disposition => 'attachment',
                         :filename => file_name,
                          :stream => false
  t.close
  t.unlink
end

使用すると期待どおりに動作しますが、同時実行性の問題が発生するt = File.new(...)ため、使用したくありません。File

を使用するt = Tempfile.new(...)と、次のようになります。

!! Unexpected error while processing request: The file identified by body.to_path does not exist`

編集: 問題の一部は、複数のファイルを送信していることにあるようです。1 曲だけ送信する場合は、Tempfile システムも機能します。

4

1 に答える 1