form表單設(shè)置enctype="multipart/form-data"后,電影保存Movie.js里save方法req.body.movie._id獲取不到
multiparty比較復(fù)雜,我使用multer的話,由于body-parser只能解析json,不能解析文件,form表單設(shè)置enctype="multipart/form-data"后,req.body就獲取不到我們要傳的參數(shù)了,因?yàn)樗徽J(rèn)識(shí)文件,express3.x就已經(jīng)移除req.files了,那么使用中間件multer是否可以混合傳參數(shù)和文件,如果不行,除了把文件上傳單獨(dú)放進(jìn)一個(gè)form并設(shè)置enctype="multipart/form-data"外有什么辦法
2017-05-18
分析的很到位。。。。。。支持。。。。。
2017-05-08
為此寫了篇文章,記錄下,有問(wèn)題的同學(xué)可以來(lái)討論討論:我的csdn博客
文件上傳和文本域同屬一個(gè)表單,并且表單設(shè)置enctype='multipart/form-data'
在savePoster里,獲取上傳的文件通過(guò)第三方中間件比如multer,multiparty等,req.file(s)可以獲取到文件
在save中,獲取表單中其他普通文本域的movie對(duì)象(包括movie[title], movie[director],movie[year]等等)可以通過(guò)body-parser的req.body.movie獲取
在設(shè)置enctype='multipart/form-data'后,文件能正常接收,可以在multer中間件提供的方法中用req.file獲取文件信息,打印req.file:
但是save里,req.body.movie._id獲取不到了,提示:
1.我們把事情弄簡(jiǎn)單點(diǎn),不設(shè)置enctype='multipart/form-data',默認(rèn)為application/x-www-form-urlencoded ? ?描述:在發(fā)送前編碼所有字符(默認(rèn))
點(diǎn)擊提交按鈕瀏覽器請(qǐng)求是這樣的(通過(guò)Formdata):
savePoster方法里獲取不到的req.file,因?yàn)楸韱我呀?jīng)被編碼了所有字符,uploadPoster只是一個(gè)文件名,不是一個(gè)文件數(shù)據(jù),save方法里正常獲取movie對(duì)象(包括movie[title], movie[director],movie[year]等等);
2.設(shè)置enctype='multipart/form-data'
描述:不對(duì)字符編碼,在使用包含文件上傳控件的表單時(shí),必須使用該值。
點(diǎn)擊提交按鈕瀏覽器請(qǐng)求是這樣的:
這里普通文本域已經(jīng)不被編碼發(fā)送給后臺(tái)了,后臺(tái)savePoster中只能通過(guò)multer中間件提供的方法中用req.file獲取文件,在save中通過(guò)req.body(我們要獲取的是req.body.movie對(duì)吧,獲取不到)獲取不到。這里瀏覽器是通過(guò)Request.payload發(fā)送普通文本域表單數(shù)據(jù),是由boundary拼接而成(這里又涉及到ff和chrome的差異了),總之我們用req.body指定是獲取不到了,在java中倒是可以通過(guò)inputstream獲取,這塊我也不是很了解。
查了很多資料,終于自己想通了. ?multer支持在獲取文件數(shù)據(jù)同時(shí)獲取表單域參數(shù)(果然看官方文檔加上自己理解才是最好的)
multer官方文檔:?multer文件上傳中間件官方文檔 --npmjs
在movie.js中
視頻里面是直接在savePoster里配置multipart,我用的是multer,singleFileUpload=multer..是我引入的multer的配置文件,里面包括了multer中間件和設(shè)置好的參數(shù)(目錄,文件大小限制等),所以我在這里可以直接用req.file獲取接收到的文件(包括req.file.originalName等等).看代碼里面的注釋差不多解析清楚了。
成功在savePoster中獲取req.file,在save中獲取req.body.movie
我還**兮兮的問(wèn)能不能分開(kāi)上傳,不放在一個(gè)表單里上傳。好可恥。哦,對(duì)了,用formidable的同學(xué)可以嘗試下,它也自帶解析普通文本域的能力
。。。慕課網(wǎng)不讓說(shuō)shabixixi,哈哈哈