在Node/Express中向客户端传输文件流

54
我希望向客户端流式传输内容,这些内容可能存储在数据库中,并且客户端会将其保存为文件。
显然,res.download可以很好地完成此任务,但是response.*函数都不接受流,只接受文件路径。
我查看了res.download的实现,它只设置Content-Disposition头,然后执行sendfile操作。
因此,我可以使用这篇文章作为指南来实现这一点。 Node.js: pipe stream to response freezes over HTTPS 但是,似乎我会错过res.send执行的所有封装方面。
我是否遗漏了什么,还是应该只管管道传输而不用担心 - 这里的最佳实践是什么?
目前正在创建临时文件,所以现在只能使用res.download。

尝试使用这种方法:https://dev59.com/tmkv5IYBdhLWcg3w_lvE#10603029 - Teemu Ikonen
2个回答

134

您可以直接将数据流传输到响应对象中(它是一个流)。

一个基本的文件流看起来会像这样。

function(req, res, next) {
  if(req.url==="somethingorAnother") {
    res.setHeader("content-type", "some/type");
    fs.createReadStream("./toSomeFile").pipe(res);
  } else {
    next(); // not our concern, pass along to next middleware function
  }
}

这将处理与 dataend 事件的绑定。


4
如果这个方法对您有帮助,您应该将其标记为已解决。 - Dana Woodman
鉴于点赞数,它似乎对许多人有效,包括我在内。谢谢! - jlh
2
如果 req.url !== "somethingorAnother",请记得调用 next - Carlos

1

确保客户端的AJAX请求设置了适当的'responseType'。例如:

$http({
  method :'GET',
  url : http://url,
  params:{},
  responseType: 'arraybuffer'
}).success()

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