res.sendFile不起作用

时间:2016-05-30 08:39:05

标签: node.js express

我正在使用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时,可以下载该文件。

发生了什么?

3 个答案:

答案 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