2017-04-05 137 views
1

我可以上傳一張圖片到S3。現在,如果選擇的文件是.gif,我希望能夠將.gif文件轉換爲.mp4並將轉換後的文件上傳到S3。只有在給出文件路徑的情況下,我才能將.gif轉換爲.mp4ffmpeg。如何從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> 

在該過程的一部分,我轉換的文件?

請幫忙。非常感謝。

回答

1

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

+0

對不起,旅行。試過第一個例子。上傳到S3的文件無論是否爲'.gif',都獲得'.mp4'擴展名。上傳的'.mp4'無法播放,它表示未知的文件格式。這是爲'.gif'上傳的,它保存在S3中作爲'.mp4'。 – Somename

+0

但是'/ uploads'文件夾中的'.mp4'文件被轉換爲'.mp4'並且可以播放。我評論了unlink部分來檢查這一點。所以看起來轉換後的文件沒有上傳到S3,並且任何到S3的文件都獲得了'.mp4'擴展名。我喜歡第一種方法。請幫助使其工作。 – Somename

+1

我的不好,這是一個小的修復,在一分鐘內編輯。 – cviejo