Biblioteca Adm-Zip para trabalhar com arquivos ZIP em Node.js
No desenvolvimento de aplicações web, utilitários de servidor ou ferramentas de processamento de dados em Node.js, frequentemente surge a necessidade de trabalhar com arquivos ZIP: compactar arquivos antes de enviar ao usuário, extrair arquivos recebidos ou manipular o conteúdo sem extração completa. No ecossistema JavaScript, existem várias bibliotecas para essas tarefas, e uma das mais populares e fáceis de usar é a Adm-Zip.
O que é Adm-Zip?
Adm-Zip é uma biblioteca JavaScript pura para Node.js que permite criar, ler e modificar arquivos ZIP sem dependências externas (por exemplo, sem instalar o utilitário zip ou unzip no sistema). Ela funciona tanto com arquivos em disco quanto com buffers em memória, tornando-a ideal para servidores web e funções em nuvem.
Principais recursos da biblioteca:
- Criação de novos arquivos ZIP a partir de arquivos, pastas ou dados de string.
- Extração de arquivos com extração para um diretório especificado ou para um buffer.
- Leitura do conteúdo do arquivo sem extração completa (visualização da lista de arquivos, leitura de entradas individuais).
- Adição, remoção e atualização de arquivos dentro de um arquivo existente.
- Trabalho com comentários no arquivo e em arquivos individuais.
- Suporte a senhas (criptografia ZipCrypto).
- Trabalho com streams para processamento de grandes volumes de dados.
Instalação
A instalação da biblioteca é padrão para pacotes npm:
npm install adm-zipApós a instalação, você pode importá-la no seu projeto:
const AdmZip = require('adm-zip');Criação de um arquivo ZIP
Criar um novo arquivo é muito simples. Você pode adicionar tanto arquivos individuais quanto pastas inteiras.
const AdmZip = require('adm-zip');
// Criamos uma nova instância do arquivoconst zip = new AdmZip();
// Adicionamos um arquivo a partir de uma stringzip.addFile('hello.txt', Buffer.from('Olá, Mundo!', 'utf8'));
// Adicionamos um arquivo do discozip.addLocalFile('/caminho/para/imagem.jpg');
// Adicionamos o conteúdo de uma pasta localzip.addLocalFolder('/caminho/para/documentos', 'backup/docs');
// Gravamos o arquivo no discozip.writeZip('meuarquivo.zip');
console.log('Arquivo criado: meuarquivo.zip');Você também pode obter o arquivo como um buffer para enviar via resposta HTTP:
const zipBuffer = zip.toBuffer();// Agora zipBuffer pode ser enviado ao usuário como um arquivo binárioExtração de um arquivo ZIP
A extração é feita em poucas linhas. A biblioteca suporta tanto a extração de todos os arquivos quanto a leitura de entradas individuais.
const AdmZip = require('adm-zip');
try { // Abrimos um arquivo existente const zip = new AdmZip('meuarquivo.zip');
// Extraímos todos os arquivos para a pasta especificada zip.extractAllTo('extraido/', true); // true — sobrescrever arquivos existentes
console.log('Arquivo extraído para a pasta extraido/');} catch (err) { console.error('Erro ao extrair:', err.message);}Se você precisar ler o conteúdo do arquivo sem extraí-lo:
const zip = new AdmZip('meuarquivo.zip');
// Obtemos um array de entradas (arquivos e pastas)const zipEntries = zip.getEntries();
zipEntries.forEach(entry => { if (!entry.isDirectory) { console.log(`Arquivo: ${entry.entryName}, tamanho: ${entry.header.size} bytes`); // Lemos o conteúdo do arquivo como string const content = entry.getData().toString('utf8'); console.log('Conteúdo:', content.substring(0, 100)); }});Trabalho com senhas (criptografia)
Adm-Zip suporta criptografia ZipCrypto. Observe: este não é o método mais moderno (AES não é suportado), mas para proteção básica é adequado.
<