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-zipBiblioteca 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 También en la biblioteca
Dokka para Kotlin: guía completa con ejemplos prácticos
Procesamiento de imágenes en Node.js: resize y crop con Sharp
HtmlAgilityPack para C# (.NET): guía completa con ejemplos
Trabajo con tokens JWT en TypeScript: librería jsonwebtoken y guía completa
NestJS para JavaScript (Node.js): guía completa con ejemplos