descargar el archivo .zip desde el servidor en nodejs

Estoy usando MEAN, en el que quiero permitir que el usuario descargue el archivo zip desde el servidor. Así que básicamente tengo que hacer las siguientes cosas:

  1. Crea archivos csv a partir de ciertos datos.
  2. Almacena ese archivo en algún directorio.
  3. Comprimir estos archivos a zip.
  4. Cuando un usuario hace clic en el botón, el archivo comprimido se debe descargar y leer.

He conseguido 1,2,3 completamente, y 4 parcialmente. En esto, he podido descargar exitosamente el archivo zip, pero este archivo está en un formato corrupto y no puedo leer este archivo.

Mi código para la funcionalidad de descarga está aquí:

html: Descarga Informes CSV

parte angular:

$scope.downloadFiles = function() { $http({ method: 'GET', url: '/download/csv/files' }). success(function(data, status, headers, config) { var anchor = angular.element(''); 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); }; 

Usé una biblioteca npm llamada Express-zip (encontrada aquí: https://www.npmjs.com/package/express-zip )

Al usar Node 4.X y Express 4.X, puedo descargar un archivo zip desde mi navegador. Hacer que funcione a través de Angular es lo que me llevó a mi propia pregunta: la descarga del cliente de un archivo zip generado por el servidor

Dado todo eso, aquí está mi código de servidor que funcionó:

Código de nodo (4.X) con expreso-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) } }); 

El utils.getFileLocations(titles) devuelve una promesa donde los files son una matriz como esta:

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

Mi archivo .zip no está dañado y es legible.