Saltar al contenido

Descargue xlsx de S3 y analícelo

Eduardo, miembro de nuestro equipo, nos hizo el favor de crear este artículo porque domina perfectamente el tema.

Solución:

Así es como puede leer un archivo de S3 nodejs y guardarlo en la memoria sin escribir primero el archivo en alguna ubicación del disco. Se puede usar con una combinación de S3 y AWS Lambda para que no tenga que escribir los archivos en alguna ubicación en Lambda.

Recuerde que este proceso es asíncrono.

   var params = 
        Bucket: "",
        Key: ""
    ;

    var file = s3.getObject(params).createReadStream();
    var buffers = [];

    file.on('data', function (data) 
        buffers.push(data);
    );

    file.on('end', function () 
        var buffer = Buffer.concat(buffers);
        var workbook = xlsx.parse(buffer);
        console.log("workbook", workbook)
    );

Si desea usar async/wait, aquí la solución:

    const AWS = require('aws-sdk');
    const XLSX = require('xlsx');

    AWS.config.update(
      accessKeyId: AMAZON_ACCESS_KEY,
      secretAccessKey: AMAZON_SECRET_ACCESS_KEY,
    );

    // Get buffered file from s3    
    function getBufferFromS3(file, callback)
      const buffers = [];
      const s3 = new AWS.S3();
      const stream = s3.getObject( Bucket: 'yor_buket', Key: file).createReadStream();
      stream.on('data', data => buffers.push(data));
      stream.on('end', () => callback(null, Buffer.concat(buffers)));
      stream.on('error', error => callback(error));
    

    // promisify read stream from s3
    function getBufferFromS3Promise(file) 
      return new Promise((resolve, reject) => 
        getBufferFromS3(file, (error, s3buffer) => 
          if (error) return reject(error);
          return resolve(s3buffer);
        );
      );
    ;

    // create workbook from buffer
    const buffer = await getBufferFromS3Promise(file);
    const workbook = XLSX.read(buffer);


    // If you want to send the workbook as a download to the api end point in node
    const fileName = "Categories.xlsx";
    res.setHeader('Content-disposition', 'attachment; filename=' + fileName);
    res.setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    const wbout = XLSX.write(workbook,  bookType: 'xlsx', type: 'buffer');
    res.send(new Buffer(wbout));

fs.writeFile es asíncrono. El archivo no estará allí hasta que se devuelva la llamada.

https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

fs.writeFile('message.txt', 'Hello Node.js', (err) => 
  if (err) throw err;
  console.log('It's saved!');
);

Comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *