您正在嘗試處理位於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