📜  如何在快速路由响应中发送 PDF 并强制浏览器下载?(1)

📅  最后修改于: 2023-12-03 14:52:55.705000             🧑  作者: Mango

如何在快速路由响应中发送 PDF 并强制浏览器下载?

当用户请求一个 PDF 文件时,我们通常希望浏览器直接下载该文件,而不是尝试在浏览器中打开。通常,浏览器将在新标签页中打开 PDF 文件,这不是我们想要的。这篇文章将介绍如何在快速路由响应中发送 PDF 并强制浏览器下载。

在 Express 中发送 PDF 文件

Express 是一种流行的 Node.js 框架,在处理 HTTP 请求时非常有用。在 Express 中,我们可以使用 res.sendFile() 方法将静态文件发送给客户端。这种方法非常简单,但它没有提供用于控制下载选项的选项。

更好的方法是使用 Node.js 自带的 fs 模块。可以使用 fs 模块读取 PDF 文件,然后将其发送到客户端。这种方法的优点是可以在发送之前更加精细地控制响应。

const fs = require('fs');
const path = require('path');

app.get('/download-pdf', (req, res) => {
  const filePath = path.join(__dirname, 'path', 'to', 'pdf', 'file.pdf');
  const stat = fs.statSync(filePath);
  
  res.writeHead(200, {
    'Content-Type': 'application/pdf',
    'Content-Length': stat.size,
    'Content-Disposition': 'attachment; filename=file.pdf'
  });
  
  const stream = fs.createReadStream(filePath);
  stream.pipe(res);
});

上面的代码可以在 Express 应用程序中用于创建下载 PDF 文件的路由。将此代码添加到您的应用程序中并访问 /download-pdf 路由以测试此路由。

确保将 "path/to/pdf/file.pdf" 替换为实际的 PDF 文件路径。该代码使用 Node.js 自带的 fs 模块读取 PDF 文件并将其发送到客户端。此代码还在响应头中包含强制下载的 Content-Disposition 头。

使用 HTTP 模块发送 PDF 文件

虽然在大多数情况下使用 Express 是很好的选择,但在某些情况下,我们可能需要直接使用 HTTP 模块来处理请求。在这种情况下,我们可以使用下面的代码读取 PDF 文件并将其发送到客户端。

const http = require('http');
const fs = require('fs');
const path = require('path');

http.createServer((req, res) => {
  const filePath = path.join(__dirname, 'path', 'to', 'pdf', 'file.pdf');
  
  fs.readFile(filePath, (error, content) => {
    if (error) {
      res.writeHead(500);
      res.end();
      return;
    }

    res.writeHead(200, {
      'Content-Type': 'application/pdf',
      'Content-Length': content.length,
      'Content-Disposition': 'attachment; filename=file.pdf'
    });

    res.end(content);
  });
}).listen(8080);

上面的代码使用 Node.js 自带的 http 模块来创建 HTTP 服务器。在 createServer() 方法内部,我们使用 fs 模块读取 PDF 文件并将其发送到客户端。类似地,在响应头中包含了强制下载的 Content-Disposition 头。

回顾一下,以上代码片段介绍了如何在快速路由响应中发送 PDF 并强制浏览器下载。我们介绍了在 Express 应用程序中使用 fs 模块和使用 HTTP 模块的两种不同方法。这些方法应该使您能够更好地控制 PDF 文件下载过程。