在Sinatra中为tempfile发送send_file

时间:2013-03-14 19:11:34

标签: ruby sinatra

我正在尝试使用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`

编辑:看起来问题的一部分是我发送了多个文件。如果我只发一首歌,Tempfile系统也能正常工作。

1 个答案:

答案 0 :(得分:0)

我的猜测是你的一个歌名中有一个拼写错误,或者是song.url最后一部分中的斜线?我adopted your code如果所有歌曲都存在,将zip文件作为临时文件发送就可以了。