如何访问multer上传的文件?
问题描述:
我可以上传一张图片到S3
。现在,如果选择的文件是.gif
,我希望能够将.gif
文件转换为.mp4
并将转换后的文件上传到S3
。只有在给出文件路径的情况下,我才能将.gif
转换为.mp4
与ffmpeg
。如何从Multer
访问上传的文件?下面是我的代码:如何访问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
的本地文件。该文件需要是您的服务器的文件系统,或者至少可以在s3
上公开获得。所以你在这里有两个选择。
一)你可以首先把文件上传到服务器,其中明确运行(不是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
文件:
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
配置。
对不起,旅行。试过第一个例子。上传到S3的文件无论是否为'.gif',都获得'.mp4'扩展名。上传的'.mp4'无法播放,它表示未知的文件格式。这是为'.gif'上传的,它保存在S3中作为'.mp4'。 – Somename
但是'/ uploads'文件夹中的'.mp4'文件被转换为'.mp4'并且可以播放。我评论了unlink部分来检查这一点。所以看起来转换后的文件没有上传到S3,并且任何到S3的文件都获得了'.mp4'扩展名。我喜欢第一种方法。请帮助使其工作。 – Somename
我的不好,这是一个小的修复,在一分钟内编辑。 – cviejo