2012-10-28 132 views
26

我想將內容流式傳輸到可能存儲在數據庫中的客戶端,這些客戶端將它們保存爲文件。將節點中的文件流式傳輸到客戶端

很明顯,res.download很好地完成了這項工作,但沒有一個響應函數接受一個流,只接受文件路徑。

我看看res.download impl,它只是設置Content-Disposition頭,然後是一個發送文件。

所以我可以用這篇文章作爲指導來實現這一點。 Node.js: pipe stream to response freezes over HTTPS

但似乎我會錯過res.send執行的所有包裝方面。

我在這裏錯過了什麼,或者我應該做管道而不用擔心 - 這裏最好的做法是什麼?

目前正在創建臨時文件,因此我現在可以使用res.download。

+0

嘗試此方法http://stackoverflow.com/questions/10207762/how-to-use-request-or-http-module-to-read-gzip-page-into-a-字符串/ 10603029#10603029 –

回答

63

您可以直接流到響應對象(它是一個Stream)。

基本的文件流看起來像這樣。

function(req, res, next) { 
    if(req.url==="somethingorAnother") { 
    res.setHeader("content-type", "some/type"); 
    fs.createReadStream("./toSomeFile").pipe(res); 
    } else { 
    next(); // not our concern, pass along to next middleware function 
    } 
} 

這將需要結合dataend事件照顧。

+2

@Tim您應該將其標記爲已回答,如果它對您有用 –

+0

鑑於上升似乎適用於許多人,並且包括我在內。謝謝! – jlh

+1

如果req.url!==「somethingorAnother」記得調用'next'' – Carlos

1

確保來自客戶端的AJAX請求具有適當的'responseType'集。例如像

$http({ 
    method :'GET', 
    url : http://url, 
    params:{}, 
    responseType: 'arraybuffer' 
}).success() 
相關問題