📅  最后修改于: 2023-12-03 14:52:55.705000             🧑  作者: Mango
当用户请求一个 PDF 文件时,我们通常希望浏览器直接下载该文件,而不是尝试在浏览器中打开。通常,浏览器将在新标签页中打开 PDF 文件,这不是我们想要的。这篇文章将介绍如何在快速路由响应中发送 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
头。
虽然在大多数情况下使用 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 文件下载过程。