18

提前抱歉,我有几个关于 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() 我会放置额外的代码来清理生成的文件。我的问题基本上是我将如何做到这一点?

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

4

1 回答 1

33

关于下载的第一部分可以通过从 NodeJS 服务器下载文件来回答。

至于在文件全部发送后删除文件,您只需添加自己的事件处理程序即可在发送完所有文件后删除文件。

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% 需要的error,但是如果在您尝试发送文件时出现错误,您不会删除该文件。

于 2013-02-19T18:45:57.150 回答