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