如何访问multer上传的文件?

问题描述:

我可以上传一张图片到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> 

在该过程的一部分,我转换的文件?

请帮忙。非常感谢。

您正在尝试处理位于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