Criação de Arquivos ZIP em Node.js usando Streams e Módulo Zlib

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.createReadStream com zlib consome uma quantidade mínima e constante de RAM, pois processa o arquivo em pequenos blocos (chunks).
  • Fluxo Seguro com stream/promises: O uso do pipeline garante 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 formatos Gzip, Gunzip e Deflate para compactar arquivos individuais; para criar estruturas compactadas com múltiplos diretórios/arquivos (.zip padrão), recomenda-se bibliotecas como archiver.
  • Desempenho em I/O: Ideal para rotinas de exportação de dados em servidores HTTP, onde a saída do zlib pode ser direcionada (piped) diretamente na resposta res da requisição.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *