将大文件(1.5gb)发送到连接速度<1的客户端。 2mbps导致浏览器只接收1.08GB的数据,但认为下载完成。更快的连接可以获得完整的1.5gb文件。
我的Express.js应用程序确定要使用response#download
方法发送和响应的文件:
app.get('/download-the-big-file', function(request, response) {
var file = {
name: 'awesome.file',
path: '/files/123-awesome.file'
};
response.header("X-Accel-Redirect: " + file.path);
response.download(file.path, file.name);
});
请注意,我将X-Accel-Redirect标头设置为使用NginxXsendfile
我的Nginx配置:
server {
client_max_body_size 2g;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8000/;
}
location /files {
root /media/storage;
internal;
}
}
答案 0 :(得分:3)
我认为最初的问题源于Node(可能在Node的I / O循环中发送大文件),而且我认为Nginx正确地从Node下载是不正确的。我有几个错误,这意味着NginxXSendfile无法正常工作,Node仍在处理响应。
我遇到语法错误:
要设置响应标头,这是正确的语法:
response.header('X-Accel-Redirect', file.path);
使用上面的标题时,不应设置响应的主体(doh!)
使用Express / Connect / Node只需#send
使用X-Accel-Redirect标头的响应,并使用response#attachment
设置内容处置:
response.attachment(file.name);
response.send();
答案 1 :(得分:0)
除了Content-Disposition
X-Accel-Redirect
Express.js代码:
app.get('/files/test.txt', function (req, res) {
res.setHeader('X-Accel-Redirect', '/files/test.txt');
res.attachment('text.txt');
res.send();
});
Nginx congif文件(/ etc / nginx / sites-available / default)
server {
location /files {
internal;
root /home/user;
}
}
这会在test.txt
(即/home/user/files
)中提供文件/home/user/files/test.txt
。