3

将大文件 (1.5gb) 发送到连接速度 < 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;
    }
}
4

2 回答 2

4

我相信最初的问题源于 Node(可能在 Node 的 I/O 循环中发送大文件),并且我认为 Nginx 正确地从 Node 下载的假设是不正确的。我有几个错误意味着 NginxXSendfile 无法正常工作,而 Node 仍在处理响应。

我有一个语法错误:
要设置响应标头,这是正确的语法:

response.header('X-Accel-Redirect', file.path);

使用上述标头时不应设置响应的正文(doh!)。
使用 Express/Connect/Node 仅#send响应带有 X-Accel-Redirect 标头的响应,并将 Content-Disposition 设置为response#attachment

response.attachment(file.name);
response.send();
于 2012-04-05T20:29:23.507 回答
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 配置文件(/etc/nginx/sites-available/default)

server {

    location /files {
      internal;
      root   /home/user;
    }
}

这为文件提供服务test.txt,在/home/user/files(即/home/user/files/test.txt)。

于 2016-02-12T16:58:36.203 回答