我在Express.js中有一个代码段,如下所示:
var pdf = printer.createPdfKitDocument(docDefinition);
pdf.pipe(fs.createWriteStream(filePath));
pdf.end();
// Send the pdf to the client.
var file = fs.createReadStream(filePath);
var stat = fs.statSync(filePath);
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);
file.pipe(res);
我可以看到该文件实际上是在服务器中创建的,但当我用createReadStream
准备它时,我得到它的大小为0.所以有些东西被破坏了。知道问题可能是什么以及如何解决它?
答案 0 :(得分:1)
文件没有损坏,您将代码视为同步,但是异步。
您必须等到文件完全写入,然后才能阅读。无论如何,您不需要将其写入文件来发送内容,如果您不需要将文件保留在磁盘上,您只需将其传送到res
。
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);
const pdf = printer.createPdfKitDocument(docDefinition);
pdf.pipe(res);
如果您希望将其保存到文件中,然后阅读它,您可以执行以下操作:
const write = fs.createWriteStream('./basics.pdf');
pdfDoc.pipe(write);
write.on('finish', () => {
fs.createReadStream('./basics.pdf')
.pipe(res); //
});
pdfDoc.end();