从nodejs中的服务器下载.zip文件

时间:2015-06-12 12:17:04

标签: angularjs node.js csv zip

我正在使用MEAN,我希望允许用户从服务器下载zip文件。 所以基本上我必须做以下事情:

  1. 从某些数据创建csv文件。
  2. 将该文件存储到某个目录中。
  3. 将这些文件压缩为zip。
  4. 当用户点击该按钮时,应下载并读取压缩文件。
  5. 我完全达到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);
         };
    

1 个答案:

答案 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文件没有损坏,并且可读。