Nginx无法从Node / Express应用程序发送完整文件

时间:2012-04-03 22:43:48

标签: node.js nginx express

将大文件(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;
    }
}

2 个答案:

答案 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