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)