2015-06-12 4 views
3

Я использую MEAN, в котором я хочу разрешить пользователю загружать zip-файл с сервера. Так что в основном я должен делать следующее:скачать .zip файл с сервера в nodejs

  1. Создайте csv-файлы из определенных данных.
  2. Сохраните этот файл в каком-либо каталоге.
  3. Сжатие этих файлов в zip.
  4. Когда пользователь нажимает на кнопку, 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

Я использовал библиотеку НПМ под названием экспресс-молния (здесь: https://www.npmjs.com/package/express-zip)

Используя Node 4.X и Express 4.X, я могу загрузить zip-файл из своего браузера. Получение его работать через угловое что привело меня к моему собственному вопросу: Client download of a server generated zip file

Учитывая все это, вот мой сервер код, который работал:

Node (4.X) код экспресс-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) возвращает обещание где files является массивом, как это:

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

Мой .zip-файл не поврежден и доступен для чтения.

Смежные вопросы