Trabalhando com arquivos ZIP em Node.js: bibliotecas archiver e adm-zip
No desenvolvimento web moderno com Node.js, surge frequentemente a necessidade de compactar arquivos em arquivos ou extrair dados deles. Seja para backup, download de vários arquivos em um único arquivo ou processamento de dados do usuário — o trabalho com o formato ZIP continua sendo muito requisitado. Para Node.js, existem várias bibliotecas populares, e neste artigo vamos abordar duas das mais poderosas e convenientes: archiver (para criar arquivos) e adm-zip (para ler e manipular arquivos).
Por que bibliotecas para trabalhar com ZIP são necessárias?
O Node.js não fornece, por padrão, ferramentas integradas para trabalhar com arquivos. Embora exista o módulo zlib para compressão de fluxos individuais, para criar arquivos ZIP completos com vários arquivos e pastas, são necessárias soluções especializadas. As bibliotecas archiver e adm-zip resolvem essas tarefas, oferecendo uma API simples e alto desempenho.
Instalação das bibliotecas
Ambas as bibliotecas são instaladas via npm. Execute no terminal:
npm install archiver adm-zipBiblioteca archiver: criação de arquivos ZIP
archiver é uma biblioteca para criar arquivos de vários formatos (ZIP, TAR, GZIP). Ela trabalha com streams, o que permite processar eficientemente grandes volumes de dados sem carregar o arquivo inteiro na memória.
Principais recursos do archiver:
- Criação de arquivos ZIP com nível de compressão configurável
- Adição de arquivos e diretórios inteiros
- Trabalho com streams para economia de memória
- Suporte a comentários e metadados
Exemplo: criando um arquivo ZIP simples
const fs = require('fs');const archiver = require('archiver');
// Cria um stream de escrita para o arquivoconst output = fs.createWriteStream('example.zip');const archive = archiver('zip', { zlib: { level: 9 } }); // compressão máxima
// Tratamento de eventosoutput.on('close', () => { console.log(`Arquivo criado: ${archive.pointer()} bytes`);});
archive.on('error', (err) => { throw err;});
// Adiciona arquivosarchive.append('Conteúdo do arquivo 1', { name: 'file1.txt' });archive.file('/path/to/existing/file.txt', { name: 'renamed-file.txt' });archive.directory('my_folder/', 'new_folder_name');
// Finaliza a compactaçãoarchive.pipe(output);archive.finalize();Exemplo: compactação com transmissão por stream
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('Arquivo de texto', { name: 'text.txt' }); archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' }); archive.finalize();}).listen(3000);Biblioteca adm-zip: leitura e extração de arquivos
adm-zip é uma biblioteca versátil para trabalhar com arquivos ZIP: leitura, escrita, atualização e extração. Ao contrário do archiver, ela trabalha não apenas com streams, mas também com buffers, o que é conveniente para arquivos pequenos.
Principais recursos do adm-zip:
- Leitura de arquivos ZIP existentes
- Extração de todos ou de arquivos individuais
- Escrita de novos arquivos (alternativa ao archiver)
- Trabalho com buffers e strings
Exemplo: extraindo arquivos de um arquivo
const AdmZip = require('adm-zip');
// Carrega um arquivo existenteconst zip = new AdmZip('./example.zip');
// Obtém a lista de arquivosconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Arquivo