我尝试在 sendfile() 上设置文件名。
1:
res.setHeader('Content-Disposition', 'attachment; filename=' + result.NAME);
res.sendFile(path.resolve(process.env.FILE_PATH +"/" + result.PATH));
Run Code Online (Sandbox Code Playgroud)
2:
let options = {
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true,
'filename' : result.NAME
}};
res.sendFile(path.resolve(process.env.FILE_PATH +"/" + result.PATH), options);
Run Code Online (Sandbox Code Playgroud)
3:
res.header('filename',result.NAME);
res.sendFile(path.resolve(process.env.FILE_PATH +"/" + result.PATH));
Run Code Online (Sandbox Code Playgroud)
但是,一路行不通。
fileName 仅由值的最后一个参数设置。
我知道使用这段代码很简单。
res.download(path.resolve(process.env.FILE_PATH +"/" + result.PATH), result.NAME)
但是,当下载文件是pdf或图像时,我想用浏览器显示文件。
我想简单地使用它,sendFile()而不使用任何其他方法,具体取决于文件扩展名。
你能帮助我吗?
如果正确设置 Content-Disposition 标头,则浏览器将提示下载res.sendFile(). 我在自己的测试应用程序中证实了这一点。
我建议改变这一点:
res.setHeader('Content-Disposition', 'attachment; filename=' + result.NAME);
Run Code Online (Sandbox Code Playgroud)
对此:
res.set('Content-Disposition', `attachment; filename="${result.NAME}"`);
Run Code Online (Sandbox Code Playgroud)
但是,老实说,两者都应该有效。
您应该在文件名周围使用引号。我也更喜欢使用它,res.set()因为它是 Express 中更高级别的功能。
仅供参考,这是我的测试应用程序。这两个路由都会提示用户保存文件:
const path = require('path');
const express = require('express');
const app = express();
app.get("/download", (req, res) => {
res.download(path.join(__dirname, "comment.json"));
});
app.get("/sendfile", (req, res) => {
res.set("Content-Disposition", 'attachment; filename="comment.json"');
res.sendFile(path.join(__dirname, "comment.json"));
});
app.listen(80);
Run Code Online (Sandbox Code Playgroud)
如果您希望某些文件在浏览器中显示,则Content-Disposition仅当您希望浏览器提示保存而不是尝试显示时有条件地添加标头。