Expressjs文件下载 - 不下载

时间:2014-08-26 09:55:52

标签: node.js express

我似乎无法使用Expressjs使我的“下载文件”功能正常工作。

//DOWNLOAD FILE
router.get('/snippets/download', function (req, res) {
  res.attachment("untitled.js");
  res.send("here is some javascript");
});

如果我在浏览器中访问此路径,则文件会下载到我的计算机,但如果我对路径使用Angularjs请求则不会。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您可以使用res.download。请参阅此处的文档:http://expressjs.com/4x/api.html

例如:

//DOWNLOAD FILE
router.post('/snippets/download', function (req, res) {
    res.download(req.body.filename, req.body.text);
});

看看这是否有帮助。

答案 1 :(得分:0)

res.download()方法需要一个文件的完整路径(在windows和linux中可能与不同的分隔符不同)。

res.download的第二个参数(localName,downloadPromptName)应该能够修改用户看到的文件名(与服务器目录中的文件不同),但似乎在我的环境中不起作用。

因此,我建议您使用res.sendFile(fullNameInServer,options),您可以在其中修改选项中下载的文件名。

var root = getDownloadRoot(req);
var options =   {
    root: getDownloadRoot(req),
    headers: {
        "content": "text/html;charset=utf-8",
        "Content-Type": "application/octet-stream",
        "Expires":"0",
        "Cache-Control": "must-revalidate, post-check=0, pre-check=0",
        "content-disposition": "attachment;filename=" + urlencode(downloadFilename)
    }
};
res.sendFile( tempFileName ,options);   

urlencode应该要求编码文件名然后你可以使用英文以外的文件名。

在调用下载文件之前,需要将文件物理写入临时文件夹, getDownloadRoot()方法为您提供运行时临时文件夹位置,当您更改运行应用程序的路径时,该位置不会发生变化。

这是函数getDownloadRoot()

function getDownloadRoot(req){
    var path = require('path');
    var sep = path.sep;
    var parentPath = path.dirname(req.settings.views);
    var ret = parentPath.concat(sep +  tempFileFolder);
    return ret;
}

现在除了使用app.setting(在app.js中声明该应用程序)以外,我没办法在运行时获取应用程序文件夹。所以我制作了一个小的“中间件”,用req对象传输值如下。

在app.js中:

app.use(function(req, res, next) {
    req.settings = app.settings;
    next();
});

tempFileFolder是一个您可以自己命名的文件夹 sep是文件夹分隔符(Windows中的\和/中的/)

在linux中运行时,您还需要查看文件夹权限设置。

这种组合在我的环境中完美运行(使用angularjs)