【发布时间】:2011-06-13 04:44:56
【问题描述】:
我使用 Linode 作为我的托管解决方案。我有一个 rails 3 应用程序,它可以动态获取 mp3(和其他媒体)并创建一个 .zip 文件以供下载。它在开发中运行良好,但是一旦我把它放在我的 prod 服务器上,zip 文件仍然会下载,但是当我解压缩它时,它会创建一个名为 foo-bar.zip.cpgz 的文件
这是来自我的控制器的代码 sn-p -
def get_zip
t = Tempfile.new("#{@foobar.slug}-#{request.remote_ip}.zip")
Zip::ZipOutputStream.open(t.path) do |zos|
@foobardownloads.each do |foobardownload|
extension = File.extname(foobardownload.foobardownload_file_name).gsub(/^\.+/, '')
zos.put_next_entry("#{foobardownload.title}.#{extension}")
zos.print open(foobardownload.foobardownload.url).read
end
end
send_file t.path, :x_sendfile => true, :type => 'application/zip', :filename => "#{@foobar.slug}.zip"
t.close
end
【问题讨论】:
-
我还应该提到我正在使用 nginx。
-
您应该使用 begin/ensure/end 块来确保临时文件在出现异常时关闭。此外,您应该在关闭临时文件 (
t.unlink) 后取消链接它(同样,在确保子句中)。
标签: ruby-on-rails ruby ruby-on-rails-3 zip linode