我正在使用Express 4.13,当我尝试提供文件时遇到了一些问题:
function doServeFile(name, fullpath, res, download) {
if (fullpath) {
if (download)
res.download(fullpath, name);
else {
res.sendFile(fullpath, {}, function (err) {
console.info(err);
});
}
}
else {
res.status(404);
}
}
function serveFile(id, res, download) {
Model.findById(id).then(file=> {
var fullPath = Config.uploadDest + "/" + file.path;
doServeFile(file.filename, fullPath, res, download)
}).catch(Util.dbErrorHandler);
}
router.get("/:id", function (req, res, next) {
serveFile(req.params.id, res);
});
router.get("/download/:id", function (req, res, next) {
serveFile(req.params.id, res, true);
});
根据显示的代码,一旦我向服务器发送请求/1
,它将检索id为1
的文件以获取文件路径,然后使用res.sendFile
来将文件提供给客户。
然而,当我运行应用程序时,我发现请求将持续很长时间才能获得响应。但我可以看到这样的日志:
---try send file:D:/file_upload/1464578330791_user.jpg
似乎已提取该文件,但res.sendFile
未完成其工作。
此外,当我尝试/download/1
时,可以下载该文件。
发生了什么?
答案 0 :(得分:0)
前几天我遇到了同样的问题,发现sendFile
实际上没有正确确认绝对路径并挂起。设置root
选项解决了问题。希望它可能适合你。
res.sendFile(fullpath, {root: '/'});
答案 1 :(得分:0)
在深入了解快递的源代码后,我找到了答案。
当res.sendFile
被调用时,express将确保路径的root
被设置或路径必须是绝对路径,检查this,它只是导致此问题的isAbsolutepath
codes:
exports.isAbsolute = function(path){
if ('/' == path[0]) return true;
if (':' == path[1] && '\\' == path[2]) return true;
if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path
};
这样的路径就像
D:/a/a.txt
不会被视为绝对路径!
D:\\a\\a.txt
将是。类似linux的路径/home/a/a.txt
也是如此。
这就是我如何构建路径(手动),这不是快递公司的绝对路径:
var fullPath = Config.uploadDest + "/" + file.path;
所以我将其改为:
var fullPath = path.join(Config.uploadDest,file.path);
有效。
答案 2 :(得分:0)
如果您使用的是Windows操作系统,请使用其完整路径,例如
d:/folder1/folder2/index.html