2012-04-03 48 views
2

將大文件(1.5GB)發送給連接速度爲<的客戶端2mbps導致瀏覽器僅接收1.08gb數據,但認爲下載完成。更快速的連接可以接收完整的1.5GB文件。Nginx無法從Node/Express應用發送完整文件

我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-阿塞爾-重定向頭利用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; 
    } 
} 

回答

3

我相信最初的問題源於節點(可能在節點的I/O循環內發送大文件) ,並且我假設Nginx正在從節點正確下載是不正確的。我有幾個錯誤,這意味着NginxXSendfile無法正常工作,並且Node仍在處理響應。

我有一個語法錯誤:
要設置響應頭,這是正確的語法:(!DOH)使用上述頭時

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

響應的身體不應該設置。
隨着快速/連接/節點正好#send的與響應的X阿塞爾 - 重定向頭,並設置內容處置與response#attachment

response.attachment(file.name); 
response.send(); 
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的/網站可用/默認)

server { 

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

這服務於文件test.txt,在/home/user/files(即, /home/user/files/test.txt)。