微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

res.download() 和 createReadStream() 下载文件的区别

如何解决res.download() 和 createReadStream() 下载文件的区别

我在node js和express中学习了两种下载文件的方式,但是我没找到它们之间的区别:res.download(path)createReadStream(path)

我知道 createReadStream() 正在创建一个流来知道服务器溢出,这是一个方法,但另一个呢?

这是两个例子:

const orderId = req.params.orderId;
const invoiceName = 'invoice-' + orderId + '.pdf';
const invoicePath = path.join('data','invoices',invoiceName)

res.download(invoicePath,(err) => {
    if (err) {
      return next(err);
    }
});

const readStream = fs.createReadStream(invoicePath);

res.setHeader('Content-type','application/pdf');
res.setHeader('Content-dispoition','attachment; filename=' + invoiceName);

readStream
    .on('open',function () {
      // This just pipes the read stream to the response object (which goes to the client)
      readStream.pipe(res);
    })
    .on('end',function () {
      readStream.unpipe(res);
      console.log('All the data in the file has been read');
    })
    .on('close',function (err) {
      console.log('Stream has been Closed');
      next(err)
    });

解决方法

简单地看一下 express res.download() 源代码,它本质上是通过替代示例自动执行您手动执行的操作。这包括依靠流进行高效传输并最大限度地减少内存占用。

https://github.com/expressjs/express/blob/master/lib/response.js

它实际上最终调用了在第 1016 行定义的 sendfile() 函数 - 最终调用了 file.pipe(res)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。