如何从multer访问上传的文件?

我能够上传一个图像到S3 。 现在,如果select的文件是.gif ,我希望能够将.gif文件转换为.mp4并将转换后的file upload到S3 。 我能够将一个.gif转换为.mp4ffmpeg只有当我给文件的path。 如何访问Multer上传的文件? 以下是我的代码:

 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); } }) }); 

我试图访问上传的文件,如下所示: ffmpeg(file)因为file是在multer函数中传递的参数。

我的表单:

 <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <br /> <input type="submit" value="Upload"> </form> 

在哪个部分的过程中,我转换文件?

请帮忙。 非常感谢。

您正试图在本地处理s3上的文件。 该文件需要是您的服务器的文件系统,或者至less在s3上公开可用。 所以你有两个select。

a)您可以先将所有file upload到快速运行的服务器上( 不在 s3 ,先暂存)。 如果该文件是一个.gif文件,则处理该文件并上传得到的.mp4文件,否则上传到s3 。 这是一个工作的例子:

 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)或者,如果您确定公开发布s3文件还可以,可以使用multer-s3将其全部上传。 由于ffmpeg也接受networking位置作为inputpath,您可以将它传递给.gif文件的s3位置,然后上传转换后的.mp4文件:

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

对于这两个示例,请记住创builduploads/文件夹并使用您的awsconfiguration。