推荐答案
在 Express 中下载文件可以通过 res.download() 方法实现。该方法会将文件作为附件发送给客户端,并触发浏览器的下载行为。
// www.javascriptcn.com code example
const express = require('express');
const app = express();
const path = require('path');
app.get('/download', (req, res) => {
const filePath = path.join(__dirname, 'files', 'example.pdf');
res.download(filePath, 'custom-filename.pdf', (err) => {
if (err) {
console.error('文件下载失败:', err);
res.status(500).send('文件下载失败');
}
});
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});本题详细解读
res.download() 方法
res.download() 是 Express 提供的一个便捷方法,用于将文件作为附件发送给客户端。它接受三个参数:
- 文件路径:要下载的文件的绝对路径。
- 可选的文件名:客户端下载文件时使用的文件名。如果不提供,Express 会使用文件路径中的文件名。
- 回调函数:文件下载完成后执行的回调函数,通常用于处理错误或执行其他操作。
示例代码解析
- 文件路径:
path.join(__dirname, 'files', 'example.pdf')用于构建文件的绝对路径。__dirname是当前模块文件所在的目录路径。 - 自定义文件名:
'custom-filename.pdf'是客户端下载文件时使用的文件名。如果不提供这个参数,客户端将使用example.pdf作为文件名。 - 错误处理:在回调函数中,如果文件下载失败,会输出错误信息并返回 500 状态码。
其他注意事项
- 文件路径安全性:确保文件路径是安全的,避免路径遍历攻击。可以使用
path.resolve()或path.join()来构建安全的路径。 - MIME 类型:Express 会自动根据文件扩展名设置正确的 MIME 类型。如果需要手动设置,可以使用
res.setHeader('Content-Type', 'application/pdf')。
通过 res.download() 方法,可以轻松实现文件下载功能,并且可以根据需要自定义文件名和处理下载过程中的错误。