Criação de Arquivos ZIP em Node.js usando Streams e Módulo Zlib
Criar arquivos compactados programaticamente é essencial para otimizar o armazenamento de relatórios, downloads de dados e backups no backend. Utilizar o módulo nativo zlib em conjunto com stream.pipeline permite gerar arquivos .zip ou .tar.gz de forma eficiente em termos de memória, processando grandes volumes de dados sem carregar todo o arquivo no buffer da aplicação.
JavaScript
const fs = require('fs');
const zlib = require('zlib');
const { pipeline } = require('stream/promises');
/**
* Compacta um arquivo de texto para o formato .gz (Gzip) de forma assíncrona.
* @param {string} caminhoOrigem - Caminho do arquivo a ser compactado.
* @param {string} caminhoDestino - Caminho do arquivo compactado final.
*/
async function compactarArquivo(caminhoOrigem, caminhoDestino) {
try {
// Pipeline conecta a leitura, a compactação e a escrita em stream contínua
await pipeline(
fs.createReadStream(caminhoOrigem),
zlib.createGzip(),
fs.createWriteStream(caminhoDestino)
);
console.log(`[Sucesso] Arquivo compactado criado em: ${caminhoDestino}`);
} catch (erro) {
console.error('Erro durante o processo de compactação:', erro.message);
}
}
// --- Exemplo Prático de Uso ---
const arquivoEntrada = './relatorio.txt';
const arquivoSaida = './relatorio.txt.gz';
// Prepara um arquivo de teste e executa a compactação
fs.writeFileSync(arquivoEntrada, 'Conteúdo de teste para compactação em stream no Node.js.');
compactarArquivo(arquivoEntrada, arquivoSaida);
Pontos-chave
- Eficiência de Memória com Streams: A combinação de
fs.createReadStreamcomzlibconsome uma quantidade mínima e constante de RAM, pois processa o arquivo em pequenos blocos (chunks). - Fluxo Seguro com
stream/promises: O uso dopipelinegarante o fechamento correto de todas as streams em caso de erro, evitando leaks de recursos e descritores de arquivos abertos. - Limitação Nativa do
zlib: O módulo nativo suporta os formatosGzip,GunzipeDeflatepara compactar arquivos individuais; para criar estruturas compactadas com múltiplos diretórios/arquivos (.zip padrão), recomenda-se bibliotecas comoarchiver. - Desempenho em I/O: Ideal para rotinas de exportação de dados em servidores HTTP, onde a saída do
zlibpode ser direcionada (piped) diretamente na respostaresda requisição.
