我以非常简单的方式使用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
答案 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)
我有几件事要你尝试:
通过添加以下内容禁用该请求的代理缓冲:
response.headers["X-Accel-Buffering"] = "no"
您的下载操作如下:
def download
response.headers["X-Accel-Buffering"] = "no"
send_file '/full/path/to/file.csv'
end
在Nginx配置中禁用sendfile
根据本文,已知此指令会在虚拟环境中造成问题: http://www.conroyp.com/2013/04/25/css-javascript-truncated-by-nginx-sendfile/
虽然我不确定这是否会以对您重要的方式影响性能,但尝试这些可能值得一试,并揭示可能有助于解决问题的更多信息。