无法将图片上传到S3。现在,如果选择的文件是.gif,我希望能够将.gif文件转换为并将转换后的文件.mp4上传到S3。我能够在转换.gif到.mp4与ffmpeg仅如果我给了文件的路径。如何从中访问上载的文件Multer?下面是我的代码:
S3
.gif
.mp4
ffmpeg
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函数中传递了一个参数。
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。该文件必须是您服务器的文件系统,或者至少要在上公开可用s3。因此,您在这里有两个选择。
s3
a) 您可以先将所有文件上传到运行express的服务器上( 不在 上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还接受网络位置作为输入路径,因此您可以向其传递文件的s3位置,.gif然后上传转换后的.mp4文件:
multer-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 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);
对于这两个示例,请记住创建一个uploads/文件夹并使用您的aws配置。
uploads/
aws