我似乎无法使用Expressjs获得我的"下载文件"功能。
//DOWNLOAD FILE
router.get('/snippets/download', function (req, res) {
res.attachment("untitled.js");
res.send("here is some javascript");
});
如果我在浏览器中访问这条路由,文件就会下载到我的电脑上,但如果我使用Angularjs请求路由,文件就不会下载到我的电脑上。
我错过了什么吗?
您可以使用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);
});
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中的/)
在linux中运行时,还需要注意文件夹权限设置。
这个组合在我的环境(使用angularjs)中工作得很好