Saltar al contenido

Subir imagen a amazon s3 usando multer-s3 nodejs

Traemos la mejor solución que encontramos por todo internet. Nuestro deseo es que te sirva de ayuda y si deseas aportar alguna mejora hazlo con total libertad.

Solución:

Completo y truco de nodo en funcionamiento | Cargue a s3 usando multer-s3 disponible.

Código:

var express = require('express'),
    aws = require('aws-sdk'),
    bodyParser = require('body-parser'),
    multer = require('multer'),
    multerS3 = require('multer-s3');

aws.config.update(
    secretAccessKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    accessKeyId: 'XXXXXXXXXXXXXXX',
    region: 'us-east-1'
);

var app = express(),
    s3 = new aws.S3();

app.use(bodyParser.json());

var upload = multer(
    storage: multerS3(
        s3: s3,
        bucket: 'bucket-name',
        key: function (req, file, cb) 
            console.log(file);
            cb(null, file.originalname); //use Date.now() for unique file keys
        
    )
);

//open in browser to see upload form
app.get('/', function (req, res) 
    res.sendFile(__dirname + '/index.html');//index.html is inside node-cheat
);

//use by upload form
app.post('/upload', upload.array('upl',1), function (req, res, next) 
    res.send("Uploaded!");
);

app.listen(3000, function () 
    console.log('Example app listening on port 3000!');
);

Para repositorio completo:

Clonar nodo-cheat express_multer_s3, ejecutar node app seguido por npm install express body-parser aws-sdk multer multer-s3.

¡Feliz ayuda!

@ V31 ha respondido muy bien, pero quiero agregar mis 2 centavos.

Creo en mantener una responsabilidad en un archivo, para una mejor organización del código y fines de depuración.

He creado un archivo para subir upload.js.

require('dotenv').config();
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

const s3Config = new AWS.S3(
    accessKeyId: process.env.AWS_IAM_USER_KEY,
    secretAccessKey: process.env.AWS_IAM_USER_SECRET,
    Bucket: process.env.AWS_BUCKET_NAME
  );

const fileFilter = (req, file, cb) => 
    if (file.mimetype === 'image/jpeg' 

// this is just to test locally if multer is working fine.
const storage = multer.diskStorage(
    destination: (req, res, cb) => 
        cb(null, 'src/api/media/profiles')
    ,
    filename: (req, file, cb) => 
        cb(null, new Date().toISOString() + '-' + file.originalname)
    
)

const multerS3Config = multerS3(
    s3: s3Config,
    bucket: process.env.AWS_BUCKET_NAME,
    metadata: function (req, file, cb) 
        cb(null,  fieldName: file.fieldname );
    ,
    key: function (req, file, cb) 
        console.log(file)
        cb(null, new Date().toISOString() + '-' + file.originalname)
    
);

const upload = multer(
    storage: multerS3Config,
    fileFilter: fileFilter,
    limits: 
        fileSize: 1024 * 1024 * 5 // we are allowing only 5 MB files
    
)

exports.profileImage = upload; 

Que se importa dentro de mis rutas. routes.js

const express = require('express');

const ProfileController = require('../profile/controller');
const  profileImage  = require('../utils/upload.js'); 

 const routes = (app) => 
    const apiRoutes = express.Router();

    apiRoutes.use('/profile', profileRoutes);
    profileRoutes.post('/',profileImage.single('profileImage'), ProfileController.saveProfile);

    app.use('/api', apiRoutes);

 

module.exports = routes

Captura de pantalla del cartero para el cuerpo de la publicación

ingrese la descripción de la imagen aquí

s3 necesita ser un objeto para ser pasado. Según los documentos, el objeto debe ser así:

var upload = multer(
  storage: multerS3(
    s3: s3,
    bucket: 'some-bucket',
    metadata: function (req, file, cb) 
      cb(null, fieldName: file.fieldname);
    ,
    key: function (req, file, cb) 
      cb(null, Date.now().toString())
    
  )
)

Documentos de MulterS3

Puntuaciones y comentarios

¡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 *