2015-04-04 98 views
4

我正在使用Multer模块进行文件上传。尽管一切正常,但是他们的github页面末尾有一个警告,其内容如下: “警告:在文件上传完成后req.body会被完全解析。提前访问req.body可能会导致错误。Express.js和multer:如何知道文件何时全部上传?

这让我真的很担心。我无法找到让.post中间件知道文件何时上传并且req.body可以使用的方法。这里是我的代码:

app.js:

app.use(multer({ 
     dest: './uploads/', 
     rename: function (fieldname, filename) { 
      return filename.replace(/\W+/g, '-').toLowerCase() + Date.now(); 
     }, 
     putSingleFilesInArray: true  
     }) 
); 

upload.js:

router.route('/') 
    .get(function(req, res){ 
     res.render('uploads'); 
    }) 
    .post(function(req, res){ 
     //how to wait here for the file to upload? 
    }); 

虽然我知道onParseEnd的,但我不知道如何实现它,这样我至少有一些关于上传过程正在完成的信息。

回答

4

Multer是路由器chanin的一部分。这意味着express将首先执行multer,并且只有一旦multer完成解析表单,它才会继续并将执行传递给.post()处理程序。页面上的警告是为了访问来自multer回调的req.body,比如onFileUploadData()和类似的。因此,执行的顺序是:

  • onParseStart
  • onFileUploadStart/onFileUploadData ...
  • onFileUploadComplete
  • onParseEnd
  • 你。员额()处理
+0

嗨@MikiJ我可以在onFileUploadComplete中使用请求将文件移动到其他位置吗? – 2015-07-30 01:57:38

0

您可以轻松地知道它,就在multer可用选项称为

  • onFileUploadComplete(文件,REQ,RES)

您可以使用此,从这里发送响应。

https://github.com/expressjs/multer#options

app.use(multer({ 
    dest: path.join(__dirname, '../uploads/fullsize'), 
    rename: function (fieldname, filename) { 
     return filename.replace(/\W+/g, '-').toLowerCase(); 
    }, 
    onFileUploadStart: function (file) { 
     console.log(file.name + ' is starting ...'); 
    }, 
    onFileUploadComplete: function (file, req, res) { 
     console.log(file.name + ' uploading is ended ...'); 
     console.log("File name : "+ file.name +"\n"+ "FilePath: "+ file.path) 
    }, 
    onError: function (error, next) { 
     console.log("File uploading error: => "+error) 
     next(error) 
    } 
    onFileSizeLimit: function (file) { 
     console.log('Failed: ', file.originalname +" in path: "+file.path) 
     fs.unlink(path.join(__dirname, '../tmpUploads/') + file.path) // delete the partially written file 
    } 

})); 
+0

这就是我是问:在我开始使用body.parse之前,我如何知道我的upload.js路由(后)文件是否已上传?您发布的代码只是在控制台写入完成,但我如何检查upload.js文件?我有app.js – uglycode 2015-04-05 08:41:26

+0

我怎么能显示文件上传的启动信息,完整,错误的HTML页面? – nolags 2016-09-28 08:02:23

2

如果我理解正确的文件警告只适用于事件处理程序可以传递给multer本身。当请求到达您的处理器时,Muller已经完成并且所有文件都已上传。

例如在rename事件中存在问题,您已经使用该事件,但该函数实际上接收四个参数fieldname, filename, req, res。这意味着您可以在完全解析之前访问请求。

相关问题