Trabalhando com arquivos ZIP em Node.js: bibliotecas adm-zip e archiver
No desenvolvimento web moderno com Node.js, surge frequentemente a necessidade de trabalhar com arquivos: compactar logs, transferir arquivos em grupos, extrair dados enviados pelo usuário. Neste material, abordaremos duas bibliotecas principais para trabalhar com o formato ZIP — adm-zip e archiver. Elas resolvem praticamente todas as tarefas relacionadas à compactação e são excelentes tanto para scripts simples quanto para aplicações em produção.
Biblioteca adm-zip: ferramenta universal para leitura e escrita de ZIP
adm-zip é uma implementação puramente em JavaScript para trabalhar com arquivos ZIP, sem dependências externas. Ela permite tanto criar novos arquivos quanto ler/modificar os existentes. A biblioteca é simples de usar e não requer a instalação de utilitários adicionais do sistema.
Instalação
npm install adm-zipCriação de um arquivo ZIP
const AdmZip = require('adm-zip');const fs = require('fs');
// Criamos uma nova instância do arquivoconst zip = new AdmZip();
// Adicionamos arquivos a partir de buffer ou stringzip.addFile('hello.txt', Buffer.from('Olá, Mundo!', 'utf8'));
// Adicionamos um arquivo localzip.addLocalFile('/caminho/para/imagem.png');
// Adicionamos uma pasta inteirazip.addLocalFolder('/caminho/para/documentos', 'docs');
// Gravamos o arquivo no discozip.writeZip('./saida/arquivo.zip');
console.log('Arquivo criado com sucesso!');Leitura e extração de um arquivo existente
const AdmZip = require('adm-zip');
// Carregamos um arquivo existenteconst zip = new AdmZip('./entrada/arquivo.zip');
// Obtemos a lista de arquivosconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`Arquivo: ${entry.entryName}, tamanho: ${entry.header.size} bytes`);});
// Extraímos todos os arquivos para uma pasta especificadazip.extractAllTo('./extraido', true); // true — sobrescrever arquivos existentes
// Ou obtemos o conteúdo de um arquivo específicoconst content = zip.readAsText('dados.json');console.log('Conteúdo de dados.json:', content);Trabalhando com buffers (sem gravar no disco)
const AdmZip = require('adm-zip');const zip = new AdmZip();
zip.addFile('relatorio.csv', 'id,nome,idade1,João,30');
// Obtemos o arquivo como Buffer para enviar via HTTPconst archiveBuffer = zip.toBuffer();
// Agora archiveBuffer pode ser enviado como resposta do servidor// ou passado para outra funçãoBiblioteca archiver: compactação avançada com fluxos
archiver é uma biblioteca mais poderosa, otimizada para trabalhar com grandes volumes de dados. Ela utiliza streams (fluxos) do Node.js, permitindo compactar arquivos "em tempo real" sem carregar todo o conteúdo na memória. Esta é a escolha ideal para aplicações de servidor com recursos limitados.
Instalação
npm install archiverCriação de um arquivo com saída em fluxo
const archiver = require('archiver');const fs = require('fs');const path = require('path');
// Criamos um fluxo de gravaçãoconst output = fs.createWriteStream('./backup.zip');const archive = archiver('zip', { zlib: { level: 9 } // Nível máximo de compressão});
// Tratamento de eventosoutput.on('close', () => { console.log(`Arquivo criado: ${archive.pointer()} bytes`);});
archive.on('error', (err) => { throw err;});
// Conectamos o fluxo do arquivo ao arquivo de saídaarchive.pipe(output);
// Adicionamos arquivosarchive.file('/var/log/app.log', { name: 'logs/app.log' });
// Adicionamos um diretório recursivamentearchive.directory('uploads/', 'arquivos_usuario');
// Adicionamos uma string como arquivoarchive.append('Este é o conteúdo do arquivo', { name: 'leia-me.txt' });
// Finalizamos a compactaçãoarchive.finalize();Envio de arquivo via resposta HTTP
const express = require('ex