Trabajo con archivos ZIP en Node.js: bibliotecas archiver y adm-zip

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con archivos ZIP en Node.js: bibliotecas archiver y adm-zip



En el desarrollo web moderno con Node.js, a menudo surge la necesidad de empaquetar archivos en archivos comprimidos o extraer datos de ellos. Ya sea para copias de seguridad, descarga de múltiples archivos en un solo archivo comprimido o procesamiento de datos de usuario, el trabajo con el formato ZIP sigue siendo muy demandado. Para Node.js existen varias bibliotecas populares, y en este artículo veremos las dos más potentes y convenientes: archiver (para crear archivos comprimidos) y adm-zip (para leer y manipular archivos comprimidos).



¿Por qué se necesitan bibliotecas para trabajar con ZIP?

Node.js no proporciona de forma predeterminada herramientas integradas para trabajar con archivos comprimidos. Aunque existe el módulo zlib para comprimir flujos individuales, para crear archivos ZIP completos con múltiples archivos y carpetas se requieren soluciones especializadas. Las bibliotecas archiver y adm-zip resuelven estas tareas ofreciendo una API simple y alto rendimiento.



Instalación de las bibliotecas

Ambas bibliotecas se instalan a través de npm. Ejecute en la terminal:

npm install archiver adm-zip


Biblioteca archiver: creación de archivos ZIP

archiver es una biblioteca para crear archivos comprimidos de varios formatos (ZIP, TAR, GZIP). Funciona con flujos (streams), lo que permite procesar eficientemente grandes volúmenes de datos sin cargar todo el archivo en memoria.



Características principales de archiver:

  • Creación de archivos ZIP con nivel de compresión configurable
  • Adición de archivos y directorios completos
  • Trabajo con flujos (streams) para ahorrar memoria
  • Soporte para comentarios y metadatos


Ejemplo: creación de un archivo ZIP simple

const fs = require('fs');const archiver = require('archiver');

// Creamos un flujo de escritura en un archivoconst output = fs.createWriteStream('example.zip');const archive = archiver('zip', { zlib: { level: 9 } }); // compresión máxima

// Manejo de eventosoutput.on('close', () => { console.log(`Archivo comprimido creado: ${archive.pointer()} bytes`);});

archive.on('error', (err) => { throw err;});

// Agregamos archivosarchive.append('Contenido del archivo 1', { name: 'file1.txt' });archive.file('/ruta/al/archivo/existente.txt', { name: 'archivo-renombrado.txt' });archive.directory('mi_carpeta/', 'nombre_nueva_carpeta');

// Finalizamos la compresiónarchive.pipe(output);archive.finalize();


Ejemplo: compresión con transmisión por flujo

const http = require('http');const archiver = require('archiver');

http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-disposition': 'attachment; filename=download.zip' });

const archive = archiver('zip', { zlib: { level: 5 } }); archive.pipe(res);

archive.append('Archivo de texto', { name: 'text.txt' }); archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' }); archive.finalize();}).listen(3000);


Biblioteca adm-zip: lectura y extracción de archivos comprimidos

adm-zip es una biblioteca versátil para trabajar con archivos ZIP: lectura, escritura, actualización y extracción. A diferencia de archiver, funciona no solo con flujos, sino también con búferes, lo que es conveniente para archivos comprimidos pequeños.



Características principales de adm-zip:

  • Lectura de archivos ZIP existentes
  • Extracción de todos o archivos individuales
  • Escritura de nuevos archivos comprimidos (alternativa a archiver)
  • Trabajo con búferes y cadenas


Ejemplo: extracción de archivos de un archivo comprimido

const AdmZip = require('adm-zip');

// Cargamos un archivo comprimido existenteconst zip = new AdmZip('./example.zip');

// Obtenemos la lista de archivosconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Archivo

Recommendations