在Node.js中从服务器下载.zip文件

3
我正在使用MEAN技术,想要允许用户从服务器下载zip文件。所以我需要完成以下步骤:
  1. 根据特定数据创建csv文件。
  2. 将该文件存储到某个目录中。
  3. 将这些文件压缩成zip格式。
  4. 当用户点击按钮时,应下载并可读取已压缩的文件。
我已经成功完成了1、2、3步,但第4步只完成了部分。我已经成功下载了zip文件,但该文件是损坏的,我无法读取该文件。
以下是我的下载功能代码:
HTML: Download CSV Reports
Angular部分:
$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

我使用了一个名为express-zip的npm库(在此处找到:https://www.npmjs.com/package/express-zip

使用Node 4.X和Express 4.X,我可以从浏览器下载zip文件。通过Angular使其正常工作是我自己提出问题的原因: 服务器生成的zip文件的客户端下载

鉴于这一切,这是我的服务器代码:

Node(4.X)代码与express-zip:

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) 返回一个 promise,其中 files 是一个类似于这样的数组:

[{path: '/path/to/file/file.abc',name:'file.abc'},{...},{...},...]

我的 .zip 文件没有损坏,可以读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接