2016-03-20 74 views
0

我試圖將表單信息與上傳文件一起保存到mongoose數據庫中。我嘗試了各種示例,但似乎已將「onFileUploadComplete」選項刪除。這是下面的代碼:NPM Multer替代onFileUploadComplete

router.post('/info', function(req, res, next){ 
    multer({ storage: 
     multer.diskStorage({ 
      destination: function(req, file, callback){ 
       var path = "./public/assets"; 
       switch(req.body.type) 
       { 
        case 'link': path += '/link'; break; 
        case 'PDF': path += '/PDF'; break; 
        case 'video': path += '/video'; break; 
        case 'audio': path += '/audio'; break; 
        case 'image': path += '/image/' + req.body.folder; break; 
       } 
       callback(null, path); 
      }, 
      filename: function(req, file, callback){ 
       callback(null, file.originalname); 
      } 
     }), 
     onFileUploadComplete: function(req, file, callback){ 
      var asset = new Asset(req.body); 
      asset.save(function(err, asset){ 
       if(err) 
        return next(err); 

       return next(); 
      }); 
     } 
    }).single('file')(req, res, function(err){ 
     if(err) 
      return res.send("Err: "+ err); 

     res.render('uploads', {authorised: true}); 
    }); 
}); 

有沒有將文件上傳到指定地點,並保存表單信息(req.body)到數據庫中的另一種方式。

任何幫助表示讚賞,感謝

回答

1

您可以通過訪問file.stream可讀的文件流。因此,您可以通過file.stream.on('end', ...)瞭解文件何時已完成讀取。如果你想知道文件是否已經完成寫入到磁盤,你需要做一些更像hacky的操作:file.stream._readableState.pipes.on('finish', ...)

但是,如果你想存儲req.body文件完成後,爲什麼不直接做在你的路由處理或者是編寫自定義的,通用的中間件封裝了multer中間件,在做這些事情都一箇中間件。例如:

function myUpload(multUpload) { 
    return function(req, res, next) { 
    multUpload(req, res, function(err) { 
     if (err) return next(err); 
     // Save `req.body` to database here, then call `next()` 
    }); 
    }; 
} 

,並用它喜歡:

// Here `upload === multer({ ... })` 
router.post('/info', myUpload(upload.single('file')), function(req, res, next) { 
    if (err) 
    return res.send("Err: "+ err); 

    res.render('uploads', {authorised: true}); 
});