3

接続速度が 2 mbps 未満のクライアントに大きなファイル (1.5 GB) を送信すると、ブラウザは 1.08 GB のデータしか受信できず、ダウンロードが完了したと認識します。より高速な接続では、1.5 GB のファイル全体が受信されます。

私の 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);
});

NginxXsendfileを利用するように X-Accel-Redirect ヘッダーを設定していることに注意してください

私の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に加えて、応答ヘッダーにa を追加する必要がありました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 に答える