我正在使用MEAN,我希望允许用户从服务器下载zip文件。 所以基本上我必须做以下事情:
我完全达到1,2,3,部分达到4。在这里我已经能够成功下载zip文件,但是这个文件格式已损坏,我无法读取此文件。
我的下载功能代码在这里:
HTML: 下载CSV报告
角度部分:
$scope.downloadFiles = function() {
$http({
method: 'GET',
url: '/download/csv/files'
}).
success(function(data, status, headers, config) {
var anchor = angular.element('<a/>');
anchor.attr({
href: 'data:attachment' + encodeURI(data),
target: '_blank',
download: 'filename.zip'
})[0].click();
}).
error(function(data, status, headers, config) {
alertify.error(data);
});
};
NodeJS:
var path = require('path'),
fs = require('fs');
exports.downaloadAllCsv = function(req, res) {
var file = 'local path to my zip file',
filename = path.basename(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type:',' application/zip');
var filestream = fs.createReadStream(file);
filestream.pipe(res);
};
答案 0 :(得分:0)
我使用了一个名为express-zip的npm库(在这里找到:https://www.npmjs.com/package/express-zip)
使用Node 4.X和Express 4.X,我可以从浏览器下载zip文件。让它通过Angular工作是我自己的问题: Client download of a server generated zip file
鉴于所有这些,这是我的服务器代码:
带有express-zip的节点(4.X)代码:
router.get('/bulkdownload',function(req,resp){
var titles = req.query.titles || [];
if ( titles.length > 0 ){
utils.getFileLocations(titles).
then(function(files){
let filename = '/tmp/zipfile.zip';
// .zip sets Content-Type and Content-disposition
resp.zip(files,filename);
},
_errorCb)
}
});
utils.getFileLocations(titles)
返回一个承诺,其中files
是这样的数组:
[{path: '/path/to/file/file.abc',name:'file.abc'},{...},{...},...]
我的.zip文件没有损坏,并且可读。