2013-02-19 43 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