¿Cómo acceder al archivo cargado desde multer?

Soy capaz de subir una imagen a S3 . Ahora, si el archivo seleccionado es .gif , quiero poder convertir el archivo .gif a .mp4 y subir el archivo convertido a S3 . Puedo convertir un archivo .gif a .mp4 con ffmpeg solo si doy la ruta del archivo. ¿Cómo Multer archivo cargado desde Multer ? A continuación se muestra mi código:

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); var aws = require('aws-sdk'); var multer = require('multer'); var multerS3 = require('multer-s3'); var s3 = new aws.S3(); var ffmpeg = require('fluent-ffmpeg'); var upload = multer({ storage: multerS3({ s3: s3, bucket: 'myBucket', key: function (req, file, cb) { console.log(file); var extension = file.originalname.substring(file.originalname.lastIndexOf('.')+1).toLowerCase(); if(extension=="gif"){ console.log("Uploaded a .gif file"); ffmpeg(file) //THIS IS NOT WORKING .setFfmpegPath("C:\\ffmpeg\\bin\\ffmpeg.exe") .output('./outputs/2.mp4') //TRYING TO UPLOAD LOCALLY, WHICH FAILS .on('end', function() { console.log('Finished processing'); }) .run(); } cb(null, filename); } }) }); 

Estoy intentando acceder al archivo cargado de esta manera: ffmpeg(file) ya que el file es un argumento que se pasa en la función de multer .

Mi forma:

   

¿En qué parte del proceso convierto el archivo?

Por favor ayuda. Muchas gracias.

Está intentando procesar un archivo localmente en s3 . El archivo debe ser el sistema de archivos de su servidor o, como mínimo, estar públicamente disponible en s3 . Así que tienes dos opciones aquí.

a) Primero puede cargar todos los archivos al servidor donde Express se está ejecutando ( no en s3 , primero los almacenamos temporalmente). Si el archivo es un archivo .gif , .gif y cargue el archivo .mp4 resultante, de lo contrario, cargue en s3 . Aquí hay un ejemplo de trabajo:

 var fs = require('fs') var path = require('path') var express = require('express'); var bodyParser = require('body-parser'); var aws = require('aws-sdk'); var multer = require('multer'); var ffmpeg = require('fluent-ffmpeg'); var shortid = require('shortid'); aws.config.update(/* your config */); var app = express(); var s3 = new aws.S3(); var bucket = 'myBucket'; var upload = multer({ storage: multer.diskStorage({ destination: './uploads/', filename: function (req, file, cb){ // user shortid.generate() alone if no extension is needed cb( null, shortid.generate() + path.parse(file.originalname).ext); } }) }); //---------------------------------------------------- app.post('/upload', upload.single('file'), function (req, res, next) { var fileInfo = path.parse(req.file.filename); if(fileInfo.ext === '.gif'){ var videoPath = 'uploads/' + fileInfo.name + '.mp4'; ffmpeg(req.file.path) .setFfmpegPath("C:\\ffmpeg\\bin\\ffmpeg.exe") .output(videoPath) .on('end', function() { console.log('[ffmpeg] processing done'); uploadFile(videoPath, fileInfo.name + '.mp4'); }) .run(); } else { uploadFile(req.file.path, req.file.filename); } res.end(); }); //---------------------------------------------------- function uploadFile(source, target){ fs.readFile(source, function (err, data) { if (!err) { var params = { Bucket : bucket, Key : target, Body : data }; s3.putObject(params, function(err, data) { if (!err) { console.log('[s3] file uploaded:'); console.log(data); fs.unlink(source); // optionally delete the file } else { console.log(err); } }); } }); } app.listen(3000); 

b) Alternativamente, si está de acuerdo en hacer públicos sus archivos s3 , puede cargarlos todos usando multer-s3 . Ya que ffmpeg también acepta ubicaciones de red como rutas de entrada, puede pasarla a la ubicación s3 de sus archivos .gif y luego cargar los archivos .mp4 convertidos:

 var fs = require('fs') var path = require('path') var express = require('express'); var bodyParser = require('body-parser'); var aws = require('aws-sdk'); var multer = require('multer'); var ffmpeg = require('fluent-ffmpeg'); var multerS3 = require('multer-s3'); aws.config.update(/* your config */); var app = express(); var s3 = new aws.S3(); var bucket = 'myBucket'; var upload = multer({ storage: multerS3({ s3: s3, bucket: bucket, key: function (req, file, cb) { cb(null, file.originalname); }, acl: 'public-read' }) }); ---------------------------------------------------- app.post('/upload', upload.single('file'), function (req, res, next) { var fileInfo = path.parse(req.file.originalname); if(fileInfo.ext === '.gif'){ var videoPath = 'uploads/' + fileInfo.name + '.mp4'; ffmpeg(req.file.location) .setFfmpegPath("C:\\ffmpeg\\bin\\ffmpeg.exe") .output(videoPath) .on('end', function() { console.log('[ffmpeg] processing done'); uploadFile(videoPath, fileInfo.name + '.mp4'); }) .run(); } res.end(); }) //---------------------------------------------------- function uploadFile(source, target){ fs.readFile(source, 'base64', function (err, data) { if (!err) { var params = { Bucket : bucket, Key : target, Body : data, ContentType : 'video/mp4' }; s3.putObject(params, function(err, data) { if (!err) { console.log('[s3] file uploaded:'); console.log(data); fs.unlink(source); // optionally delete the file } else { console.log(err); } }); } }); } app.listen(3000); 

Para ambos ejemplos, recuerde crear una carpeta uploads/ y use su configuración de aws .