¿Cómo comprimir una carpeta en la aplicación node js y después de iniciar la descarga de zip?

Intenté con el paquete npm adm-zip 0.4.4 porque el último 0.4.7 no funciona, adm-zip 0.4.4 funciona en Windows pero no en Mac y Linux. Otro problema es que solo quiero que zip_folder esté comprimido, pero comprime toda la estructura del directorio desde la folder_1 . Este es el código:

 var zip = new admZip(); zip.addLocalFolder("./folder_1/folder_2/folder_3/**zip_folder**"); zip.writeZip("./folder_1/folder_2/folder_3/download_folder/zip_folder.zip"); 

Todo esto sucede en el lado del servidor. He buscado mucho y he probado muchos paquetes npm para comprimir una carpeta o directorio. ¿Alguna sugerencia o algún otro buen enfoque para resolver mi problema?

También puedes usar el archivador de nodos , que fue muy útil cuando lo estaba usando. Primero necesitas create e instancia del archiver siguiente manera:

 var fs = require('fs'); var archiver = require('archiver'); var archive = archiver.create('zip', {}); var output = fs.createWriteStream(__dirname + '/zip_folder.zip'); 

De esta forma, le indica al archiver que comprima los archivos o carpetas según el formato que pase junto con el método. En este caso es zip . Además, creamos un writeStream que se canalizará al archiver como su salida. También usamos el método de directory para agregar un directorio y sus archivos, recusivamente, dado su dirpath :

 archive.pipe(output); archive .directory(__dirname + '/folder_1/folder_2/folder_3/download_folder/zip_folder') .finalize(); 

Al final, necesitamos finalize la instancia que impide agregar más elementos a la estructura del archivo.

Otra opción es usar el método bulk así:

 archive.bulk([{ expand: true, cwd: './folder_1/folder_2/folder_3/download_folder/zip_folder/', src: ['**/*'] }]).finalize(); 

Actualización 1

Una pequeña explicación de la [**/*] syntax : esto incluirá recursivamente todas las carpetas ** y archivos * .

Trate de usar la función zip del sistema:

 var execFile = require('child_process').execFile; execFile('zip', ['-r', '-j', zipName, path], function(err, stdout) { if(err){ console.log(err); throw err; } console.log('success'); }); 

Reemplace zipName y path con lo que necesita.