Carga de archivos en Amazon S3 desde NodeJS

nodejs   amazon

Hace muchísimo tiempo que no escribo nada aquí!, me consumió el mundo Enterprise 🙁 pero ya estoy libre!. Ahora a lo que nos compete. Esta guía no trata del funcionamiento de Amazon S3 ni de NodeJS, ojo con eso. Comenzamos!
Primero a través de nuestra terminal instalamos la librería para conectarnos a Amazon S3

npm install aws-sdk

Luego en nuestro archivo .js importamos la librería y la configuramos con nuestras credenciales de acceso. Para finalmente crear la instancia s3 que utilizaremos para accesar al S3 de Amazon.

var aws = require('aws-sdk');
aws.config.update({
    accessKeyId: 'XXXXXXXXXXXXXXXXXXXX',
    secretAccessKey: 'XXxxXxXXXxxxXxXXXxXXxxXXxxXXXxxxx'
});
var s3 = new aws.S3();

Ahora ya podemos listar nuestros buckets.

s3.listBuckets(function(err, data){
    for(var index in data.Buckets){
        var bucket = data.Buckets[index];
        console.log("Bucket: ", bucket.Name, ' : ', bucket.CreationDate);
    }
});

Y insertar una nueva imagen. Para estos casos yo siempre mando la imagen en base64, entonces antes de guardarla en el S3 tengo que meterla a un Buffer

var image = req.body.image;
var buff = new Buffer(image.replace(/^data:image\/\w+;base64,/, ""),'base64');

Creo una variable con los parámetros para el putObject

var params = {
    Bucket: 'nombre_bucket',
    Key: 'nombre_imagen.png',
    Body: buff,
    ACL: 'public-read'
};

Un parámetro importante en la linea anterior es ACL, ‘public-read’ permite que la imagen pueda ser (como su nombre lo dice) pública.

s3.putObject(params, function(err, data){
    if(!err){
        console.log('load ok');
    }else{
        console.log('load fail');
    }
});

Y si es un archivo que tienen en su disco

var params = {Bucket: 'myBucket', Key: 'nombre_archivo.png'};
var file = require('fs').createWriteStream('/path/to/file.jpg');
s3.getObject(params).createReadStream().pipe(file);

Y eso es todo!
Comentarios y sugerencias son totalmente bienvenidos, saludos!

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *