如何使用 sendfile() 在express中设置文件名?

rhr*_*gut 2 node.js express

我尝试在 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()而不使用任何其他方法,具体取决于文件扩展名。

你能帮助我吗?

jfr*_*d00 7

如果正确设置 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仅当您希望浏览器提示保存而不是尝试显示时有条件地添加标头。