es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Nodo Zlib. Descomprime la respuesta con la estructura de archivos en memoria.

Estoy recibiendo un búfer “data” de una respuesta con datos en un archivo.

JavaScript
// Guárdalo solo para comprobar si el contenido es correcto
const fd = fs.openSync(‘data.zip’, ‘w’)
fs.writeSync(fd, data)
fs.closeSync(fd)

Produce el archivo “data.zip”, que contiene el archivo “foo.csv”.

Puedo descomprimirlo en memoria con “UZIP” usando:

JavaScript
const unzipArray = UZIP.parse(data)[‘foo.csv’]

Sin embargo, no puedo hacerlo con Zlib.

JavaScript
const unzipArray = zlib.unzipSync(data)
// Lanza: incorrect header check

Parece que Zlib no puede analizar la estructura del archivo.

¿Cómo puedo descomprimir el búfer mencionado anteriormente en memoria con Zlib sin guardar archivos en el sistema de archivos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, zlib no puede descomprimir directamente un archivo comprimido que contiene múltiples archivos como el data.zip en este escenario. Está diseñado para trabajar con archivos comprimidos individuales.

    Para descomprimir el archivo específico foo.csv de data.zip en memoria usando node.js y zlib, podemos utilizar una combinación de los módulos zlib y unzip-stream. El módulo unzip-stream crea un flujo legible a partir de un archivo zip que podemos pasar a un analizador. Así es como se hace:

    const zlib = require('zlib');
    const unzipper = require('unzip-stream');
    
    // Suponiendo que `data` es el búfer recibido de la respuesta
    
    zlib.unzip(data, (err, buffer) => {
      if (err) throw err;
    
      const readable = new stream.PassThrough();
      readable.end(buffer);
    
      const parse = unzipper.ParseOne(/foo\.csv/);
      readable.pipe(parse);
    
      parse.on('entry', (entry) => {
        var rows = []
        entry.on('data', (chunk) => {
          rows.push(chunk.toString());  // Suponiendo que está en formato CSV
        });
    
        entry.on('end', () => {
          console.log(rows.join(''));   // Los datos de su archivo CSV
        });
      });
    });
    

    El ejemplo anterior descomprime el búfer data utilizando zlib, crea un flujo legible a partir del búfer descomprimido, lo conecta a un analizador de unzip-stream y analiza la entrada del archivo foo.csv. Luego, los datos se transmiten fila por fila (suponiendo que está en formato CSV) y se unen para formar un conjunto completo de datos CSV.

    Nota: Esto requiere tener el módulo unzip-stream instalado a través de npm.

    npm install unzip-stream
    

Comments are closed.