带有X-Accel-Redirect的send_file不会返回完整的文件内容

时间:2015-04-04 01:43:55

标签: ruby-on-rails nginx

我以非常简单的方式使用send_file与Nginx进行X-Accel-Redirect,但浏览器不会下载完整内容。它总是在中间切断,其余部分被截断,就像40MB的4MB文件一样。

Rails 4.2.1 / Nginx 1.6.2

什么在中断文件下载?

production.rb

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

download_controller.rb

class DownloadController
  def download
    send_file '/full/path/to/file.csv'
  end
end

2 个答案:

答案 0 :(得分:0)

您的ngnix conf文件中是否有client_max_body_size

  

来自the docs
  这用于设置Content-Length请求标头字段中指定的客户端请求主体的最大允许大小。    如果请求中的大小超过配置的值,则会将413(请求实体太大)错误返回给客户端。请注意,浏览器无法正确显示此错误。将大小设置为0将禁用检查客户端请求正文大小

您可以在conf文件中进行设置。

 server {
 ...
 client_max_body_size 4G;
 }

  location / {
  ...
  client_max_body_size 4G;
  } 

答案 1 :(得分:0)

我有几件事要你尝试:

  1. 通过添加以下内容禁用该请求的代理缓冲:

    response.headers["X-Accel-Buffering"] = "no"
    

    您的下载操作如下:

    def download
      response.headers["X-Accel-Buffering"] = "no"
      send_file '/full/path/to/file.csv'
    end
    
  2. 在Nginx配置中禁用sendfile

    根据本文,已知此指令会在虚拟环境中造成问题: http://www.conroyp.com/2013/04/25/css-javascript-truncated-by-nginx-sendfile/

  3. 虽然我不确定这是否会以对您重要的方式影响性能,但尝试这些可能值得一试,并揭示可能有助于解决问题的更多信息。