createReadStream()。pipe()回调

时间:2013-02-19 16:12:58

标签: javascript node.js

提前抱歉,我在这里有关于createReadStream()的几个问题。

基本上我正在做的是动态构建一个文件,并在完成后使用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()上我将添加额外的代码来清理生成的文件。我的问题基本上是如何解决这个问题?

非常感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:27)

关于下载的第一部分可以通过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');
});

{100}处理程序不是100%需要,但如果在尝试发送时出错,则不会删除该文件。