NodeJS 快速下载没有文件名且只有扩展名(如.“gitignore”)的文件会导致FileNotFound,即使路径正确且文件存在

nmpmafwu  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(169)

我正在写一个简单的文件服务器来上传和下载express@4.18.2文件,我被困在下载部分。每当我试图下载一个没有名字,只有扩展名的文件(比如.gitignore.prettierrc)res.download,我得到一个NotFoundError(见下面的完整错误消息)。示例:

app.get("/download", function (req: Request, res: Response) {
    res.download("C:/Users/stadl/Desktop/File-Server/.gitignore");
});

会导致NotFoundError,但以下操作有效:

app.get("/download", function (req: Request, res: Response) {
    res.download("C:/Users/stadl/Desktop/File-Server/t.txt");
});

文件路径都正确,并且两个文件都存在,目录结构如下所示:

C:/Users/stadl/Desktop/File-Server/
|
|
| - - - client/
| - - - server/
|          |
|          | - - - server.ts (contains the app.get("/download")... snippet)
|          . . .
| 
| - - - .gitignore
| - - - t.txt
|
. . .

对于相对路径(../.gitignore../t.txt)也是如此。这是一个bug吗?是有意的吗?还是我做错了什么?

mnemlml8

mnemlml81#

您需要通过设置allow来允许res.downloadoptions对象中的点文件,因为默认情况下它是禁用/忽略的(默认值ignore发送404):

res.download("C:/Users/stadl/Desktop/File-Server/.gitignore", {dotfiles:"allow"});

参见:
点文件
提供点文件的选项。可能的值是"允许"、"拒绝"、"忽略"。
https://expressjs.com/en/5x/api.html#res.download
以及
点文件
此选项的可能值为:
"allow"-不对点文件进行特殊处理。
"deny"-拒绝对. file的请求,用403响应,然后调用next()。
"ignore"--就像这个点文件不存在一样,用404响应,然后调用next()。
https://expressjs.com/en/5x/api.html#express.static

相关问题