2016-12-15 111 views
0

我有一些文本字段和文件輸入不能爲空的表單,我想先用文本字段做一些操作(添加到數據庫),如果這些操作成功了,上傳文件。這是現在我的代碼:Multer訪問req.body沒有上傳文件

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.array(),function(req,res){ 
var artist = new ArtistModel({ 
      name : req.body.name.toLowerCase(), 
      description:req.body.description, 
      }); 

我再加入藝術家我DB和成功的回調我要上傳的文件。然而,問題是我不能簡單地使用getFields.array(),因爲我有文件輸入,並且出現「Unexpected fields」錯誤,如果我不使用.array(),我無法獲得發佈請求主體。無論如何,首先獲得enctype =「multipart/form-data」的表單文本字段,然後上傳文件?

更新#2 感謝Dave我能得到的文本字段,而上傳文件,我成功添加我的藝術家到我的數據庫,但我無法弄清楚如何上傳文件後, 我在我addToDb的回調函數創建一個新的變量:

var storage = multer.diskStorage({ 
      destination: function (req, file, cb) { 
       //cb(null, 'artistsMedia/drake/songs') 
       var dir = 'artistsMedia/' + req.body.name.toLowerCase()+ '/images'; 
       mkdirp(dir,err => cb(err,dir)) 
      }, 
      filename: function (req, file, cb) { 
       cb(null, req.body.name.toLowerCase() +'-'+ file.fieldname +'-'+ Date.now() + path.extname(file.originalname)) //Appending extension 
      }, 

      }); 
      var upload = multer({ 
      storage: storage, 
      limits :{fileSize :52428800} 
      }).fields([{name:'Logo',maxCount:1},{name:'artistHome',maxCount:1},{name:'otherImgs',maxCount:10}]); 

但是調用upload(req,res,err)似乎沒有工作。

+0

如果你想創建藝術家後,將文件上傳,REST的方式是創建藝術家,使用Location響應頭返回201 CREATED響應(也可能是一個包含新創建對象的主體)。然後,客戶端將解析響應主體或響應頭以確定新對象的ID,然後發出* second *請求來POST文件。 (或者你可以發送第一個請求的文件,並一次完成)。 – Dave

回答

1

嘗試用multer的any()功能:

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.any(),function(req,res){ 
    // any files, if sent, will be in req.files 
    var artist = new ArtistModel({ 
    name : req.body.name.toLowerCase(), 
    description:req.body.description, 
    }); 
}); 

如果你是肯定會有沒有提交任何文件,請使用multer的none()功能:

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.none(),function(req,res){ 
    // uploading files will cause an error 
    var artist = new ArtistModel({ 
    name : req.body.name.toLowerCase(), 
    description:req.body.description, 
    }); 
});