如何将Node/Express应用程序中的pdf文件发送到浏览器

Eug*_*erg 15 node.js express

在我的Node/Express应用程序中,我有以下代码,它假设从文件中读取PDF文档,并将其发送到浏览器:

var file = fs.createReadStream('./public/modules/datacollectors/output.pdf', 'binary');
var stat = fs.statSync('./public/modules/datacollectors/output.pdf');
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=quote.pdf');
res.pipe(file, 'binary');
res.end(); 
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,但我也没有在浏览器中获取该文件.我究竟做错了什么?

has*_*sin 32

您必须从可读流管道传输到可写流,而不是相反:

var file = fs.createReadStream('./public/modules/datacollectors/output.pdf');
var stat = fs.statSync('./public/modules/datacollectors/output.pdf');
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=quote.pdf');
file.pipe(res);
Run Code Online (Sandbox Code Playgroud)

此外,您正在以错误的方式设置编码,如果需要,传递带编码的对象.

  • `res.send(buffer)` 用于缓冲区。 (6认同)
  • 现在我可以看到文件内容被发送到浏览器控制台,但该文件仍然不会作为附件从浏览器"弹出". (2认同)
  • @EugeneGoldberg 您可以使用此节点模块 https://www.npmjs.com/package/file-saver 下载数据。您可以将数据转换为 blob,如下所示 var blob = new Blob([data], {type: "application/pdf"}); FileSaver.default(blob, fileNameWithExtension); (2认同)

Wen*_*ang 12

我想我在另一篇文章中使用节点js显示PDF文件离子浏览器中找到了答案.

在Chrome中测试您的代码后,它会立即开始下载PDF文件.但是,如果您想显示PDF文件的内容,可以尝试以下方法:

var data =fs.readFileSync('./public/modules/datacollectors/output.pdf');
res.contentType("application/pdf");
res.send(data);
Run Code Online (Sandbox Code Playgroud)

这应该直接将PDF内容发送到浏览器.

希望这能回答你的问题.

  • 这对我有用。谢谢。 (2认同)

Chr*_*ant 8

这是最简单的方法:

app.get('/', (req, res) => res.download('./file.pdf'))
Run Code Online (Sandbox Code Playgroud)

如果这给你带来麻烦。检查 Express.js 版本或任何可能需要的中间件。

干杯