Trabajo con archivos ZIP en Node.js: bibliotecas adm-zip y archiver
En el desarrollo web moderno con Node.js, a menudo surge la necesidad de trabajar con archivos: empaquetar registros, transferir archivos en grupos, descomprimir datos cargados por el usuario. En este material, analizaremos dos bibliotecas principales para trabajar con el formato ZIP: adm-zip y archiver. Resuelven prácticamente todas las tareas relacionadas con la compresión y son excelentes tanto para scripts simples como para aplicaciones de producción.
Biblioteca adm-zip: herramienta universal para leer y escribir ZIP
adm-zip es una implementación puramente en JavaScript para trabajar con archivos ZIP sin dependencias externas. Permite tanto crear nuevos archivos como leer/modificar los existentes. La biblioteca es fácil de usar y no requiere la instalación de utilidades adicionales del sistema.
Instalación
npm install adm-zipCreación de un archivo ZIP
const AdmZip = require('adm-zip');const fs = require('fs');
// Creamos una nueva instancia del archivoconst zip = new AdmZip();
// Agregamos archivos desde un buffer o cadenazip.addFile('hello.txt', Buffer.from('¡Hola, Mundo!', 'utf8'));
// Agregamos un archivo localzip.addLocalFile('/ruta/a/imagen.png');
// Agregamos una carpeta completazip.addLocalFolder('/ruta/a/documentos', 'docs');
// Escribimos el archivo en el discozip.writeZip('./salida/archivo.zip');
console.log('¡Archivo creado exitosamente!');Lectura y descompresión de un archivo existente
const AdmZip = require('adm-zip');
// Cargamos un archivo existenteconst zip = new AdmZip('./entrada/archivo.zip');
// Obtenemos la lista de archivosconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Archivo: ${entry.entryName}, tamaño: ${entry.header.size} bytes`);});
// Extraemos todos los archivos a una carpeta especificadazip.extractAllTo('./extraido', true); // true — sobrescribir archivos existentes
// O obtenemos el contenido de un archivo específicoconst content = zip.readAsText('data.json');console.log('Contenido de data.json:', content);Trabajo con buffers (sin escribir en disco)
const AdmZip = require('adm-zip');const zip = new AdmZip();
zip.addFile('reporte.csv', 'id,nombre,edad1,Juan,30');
// Obtenemos el archivo como Buffer para enviarlo a través de HTTPconst archiveBuffer = zip.toBuffer();
// Ahora archiveBuffer se puede enviar como respuesta del servidor// o pasarlo a otra funciónBiblioteca archiver: compresión avanzada por flujos
archiver es una biblioteca más potente, optimizada para trabajar con grandes volúmenes de datos. Utiliza flujos (streams) de Node.js, lo que permite comprimir archivos «sobre la marcha» sin cargar todo el contenido en memoria. Es la elección ideal para aplicaciones de servidor con recursos limitados.
Instalación
npm install archiverCreación de un archivo con salida por flujo
const archiver = require('archiver');const fs = require('fs');const path = require('path');
// Creamos un flujo de escrituraconst output = fs.createWriteStream('./backup.zip');const archive = archiver('zip', { zlib: { level: 9 } // Máximo nivel de compresión});
// Manejo de eventosoutput.on('close', () => { console.log(`Archivo creado: ${archive.pointer()} bytes`);});
archive.on('error', (err) => { throw err;});
// Conectamos el flujo del archivo al archivo de salidaarchive.pipe(output);
// Agregamos archivosarchive.file('/var/log/app.log', { name: 'logs/app.log' });
// Agregamos un directorio recursivamentearchive.directory('uploads/', 'archivos_usuario');
// Agregamos una cadena como archivoarchive.append('Este es el contenido del archivo', { name: 'leeme.txt' });
// Finalizamos la compresiónarchive.finalize();Envío de un archivo a través de una respuesta HTTP
const express = require('ex También en la biblioteca
golangci-lint para Go: guía completa con ejemplos prácticos
Colas de tareas para Kotlin: Coroutines y KJobQueue
Trabajo con fechas en JavaScript (Node.js): mejores bibliotecas
Procesamiento de imágenes en Node.js: bibliotecas y herramientas