NodeJS 如何将PDF从服务器发送到浏览器

aij0ehis  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(158)

在当前的配置中,我们在AWS中实现了一个功能,其中为特定目标组启用了粘性,特别是用于下载结果。但是,禁用此功能会中断功能。后端工作流涉及向第三方服务发出请求以获取PDF文件,这些文件随后存储在EC2示例的本地磁盘上。然后,服务器将这些PDF文件提供给请求用户。当用户连接到不同的EC2示例时,会出现一个固有的挑战,因为PDF文件被限制在最初存储它们的示例中,使得连接到替代示例的用户无法访问它们。
为了解决这个问题并确保PDF文件在多个EC2示例之间的无缝访问,需要一个涉及集中存储和分发的解决方案。
下面是当前的实现`const pdfData = await someThirdParty(id)

if (!pdfData.data.data.success) { throw new Error(pdfData.data.data.message) }

  fs.writeFileSync(
    filePath,
    pdfData.data.data.report.replace(/^data:application\/pdf;base64,/, ''),
    'base64',
    (err) => {
      throw new Error(err)
    }
  ) `

目前我将此PDF存储在nodecache中
一个解决方案,我可以想到的存储文件在s3桶,但我不想存储在那里,由于明显的原因。我想要的是,我直接为用户提供PDF文件,而不存储在本地服务器上
按需生成PDF:当用户请求下载时,从第三方服务获取或生成PDF。
直接流式传输PDF:将PDF内容直接流式传输到用户的浏览器,而无需将其保存在服务器上。
将PDF发送给用户:将流式传输的PDF数据作为HTTP响应发送给用户进行下载。
这确保了PDF在不本地存储的情况下提供给用户,从而维护了一个无服务器且高效的系统。

mfpqipee

mfpqipee1#

我想你要找的是PIPE
你会这样使用它:

app.get('/download_pdf', (req, res) => {
    // get a readable stream
    let pdf_read_stream = get_from_third_party();
    // set headers
    res.setHeader('Content-Type', 'application/pdf');
    res.setHeader("Content-Disposition", "attachment; your_file.pdf");
    // send to client
    pdf_read_stream.pipe(res);
});

这样即使文件非常重,它也会在从第三方存储下载时发送

相关问题