【问题标题】:Issue generating .zip files in prod (Rails 3)在产品中生成 .zip 文件的问题(Rails 3)
【发布时间】: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


【解决方案1】:

好的 - 进行了一些挖掘 - 这实际上是一个带有 rails 3、nginx 和 send_file 的问题。解决方案在这里:

http://www.novafist.com/2010/09/send_file-sends-0-bytes-to-client-in-rails/

“快速而肮脏”的技巧是打开您的 production.rb 文件并取消注释此行

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

确保

#config.action_dispatch.x_sendfile_header = "X-Sendfile"

仍被注释掉。

【讨论】:

  • 该更改似乎也适用于 Apache2。我在递归压缩 zip 文件时遇到了同样的问题。这项更改为我解决了问题。
  • novafist 站点已关闭,但此答案中包含解决方案。这不是 hack,而是正确配置。
猜你喜欢
  • 2015-02-23
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2018-07-31
相关资源
最近更新 更多