2013-02-19 48 views
12

對不起,我在這裏有幾個關於createReadStream()的問題。createReadStream()。pipe()回調

基本上,我正在做的是動態構建一個文件並在完成後使用fs將其傳輸給用戶。我正在使用.pipe()來確保正確調節(如果緩衝區已滿,請停止讀取,一旦沒有,請重新開始,等等。)以下是我的代碼示例。

http.createServer(function(req, res) { 
    var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) 

    stream.pipe(res); 

}).listen(3002, function() { 
    console.log('Server listening on port 3002') 
}) 

我在另一個StackOverflow的問題讀取(抱歉,失去了它),如果你使用的常規res.send()和res.end()的.pipe()的偉大工程,因爲它調用.send和.end並添加限制。

對於大多數情況,這很好,除非我想在流完成時刪除文件而不使用.pipe()意味着我將不得不自己處理調節以獲得回調。

所以我猜我會想創建我自己的假「res」對象,它有一個.send()和.end()方法來完成res通常會做的事情,但是在.end )我會放置額外的代碼來清理生成的文件。我的問題基本上是如何解決這個問題?

幫助與此將不勝感激,謝謝!

+0

[從NodeJS服務器下載文件]可能的重複(http://stackoverflow.com/questions/7288814/download-file-from-nodejs-server) – loganfsmyth 2013-02-19 16:55:16

+0

這確實回答我的文件下載問題,謝謝!我將更新問題以僅反映.pipe()問題。 – 2013-02-19 17:49:11

回答

25

關於下載的第一部分可以通過Download file from NodeJS Server回答。

至於在文件全部發送後刪除文件,只要添加自己的事件處理程序即可在刪除文件後刪除文件。

var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) 
stream.pipe(res); 

var had_error = false; 
stream.on('error', function(err){ 
    had_error = true; 
}); 
stream.on('close', function(){ 
    if (!had_error) fs.unlink('<filepath>/example.pdf'); 
}); 

error處理器並不是100%需要的,但這時如果有一個錯誤,而你正在嘗試發送它不會刪除該文件。

+0

啊,輝煌!我不知道在管道流時可以添加事件。我假設每個事件只能有一個事件處理程序,並且它將被pipe()調用使用。謝謝! – 2013-02-19 18:53:15