createReadStream().pipe() 回调函数

20

提前道歉,我在这里有几个关于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() 中,我将加入额外的代码来清理生成的文件。我的问题基本上是如何实现这一点?

非常感谢帮助!


可能是从NodeJS服务器下载文件的重复问题。 - loganfsmyth
确实回答了我的文件下载问题,谢谢!我会更新问题,只涉及.pipe()的问题。 - AlbertEngelB
1个回答

33

关于下载的第一部分可以在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处理程序并非必需,但如果在发送文件时出现错误,则不会删除该文件。


1
啊,太棒了!我不知道你可以在管道流时添加事件。我以为每个事件只能有一个事件处理程序,并且它会被pipe()调用消耗掉。谢谢! - AlbertEngelB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接