第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

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"外有什么辦法

正在回答

2 回答

分析的很到位。。。。。。支持。。。。。

0 回復(fù) 有任何疑惑可以回復(fù)我~

為此寫了篇文章,記錄下,有問(wèn)題的同學(xué)可以來(lái)討論討論:我的csdn博客

我們?cè)诼酚衫锸沁@樣處理的
router.post('/admin/movie/save',???????User.signinRequired,?User.permission,?Movie.savePoster,?Movie.save);

理想狀態(tài):

文件上傳和文本域同屬一個(gè)表單,并且表單設(shè)置enctype='multipart/form-data'

  1. 在savePoster里,獲取上傳的文件通過(guò)第三方中間件比如multer,multiparty等,req.file(s)可以獲取到文件

  2. 在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:

{?fieldname:?'uploadPoster',
??????originalname:?'b922270259dece707ef6c6a50259a406_r.png',
??????encoding:?'7bit',
??????mimetype:?'image/png',
??????destination:?'public/uploads',
??????filename:?'uploadPoster_1494237299545.png',
??????path:?'public\\uploads\\uploadPoster_1494237299545.png',
??????size:?134815?}


但是save里,req.body.movie._id獲取不到了,提示:

Cannot?read?property?'id'?of?undefined

分析:

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):

http://img1.sycdn.imooc.com//591042ea00011eec04220389.jpg

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)求是這樣的:

http://img1.sycdn.imooc.com//591044910001bde604400850.jpg

這里普通文本域已經(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

var?express?=?require('express')
var?multer??=?require('multer')
var?upload?=?multer({?dest:?'uploads/'?})
var?app?=?express()app.post('/profile',?upload.single('avatar'),?function?(req,?res,?next)?{??
//?req.file?是?name為`avatar`?文件的信息
//?req.body?將具有文本域數(shù)據(jù),?如果存在的話})

在movie.js中

/*savePoster*/
	exports.savePoster?=?function(req,?res,?next)?{
		var?singleFileUpload=multer.single('uploadPoster');?????????//設(shè)置上傳方式為單文件上傳?	
		singleFileUpload(req,?res,?function(err){
			if?(err)?{
?????????	return??console.log(err);
????		}?
????????	
????	????req.body?=?req.body;??//由于設(shè)置了enctype='multipart/form-data',我們?cè)趕ave方法里取req.body是取不到值的,這里使用multer的req.body能獲取文本域的值,將multer里的req.body賦給當(dāng)前的req.body,并next傳給save方法
????	????console.log(req.file);
????	????next();
		});
??			
??			
		}

視頻里面是直接在savePoster里配置multipart,我用的是multer,singleFileUpload=multer..是我引入的multer的配置文件,里面包括了multer中間件和設(shè)置好的參數(shù)(目錄,文件大小限制等),所以我在這里可以直接用req.file獲取接收到的文件(包括req.file.originalName等等).看代碼里面的注釋差不多解析清楚了。

exports.save?=?function(req,?res)?{
var?movieObj?=?req.body.movie;
var?id?=?movieObj._id;
...

結(jié)果:

成功在savePoster中獲取req.file,在save中獲取req.body.movie


后記:

我還**兮兮的問(wèn)能不能分開(kāi)上傳,不放在一個(gè)表單里上傳。好可恥。哦,對(duì)了,用formidable的同學(xué)可以嘗試下,它也自帶解析普通文本域的能力

var?form?=?new?formidable.IncomingForm();
form.parse(req,?function(err,?fields,?files)?{
????//do?something?with?files?or?req.body(if?its?exists)
...

。。。慕課網(wǎng)不讓說(shuō)shabixixi,哈哈哈

2 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
node建站攻略(二期)——網(wǎng)站升級(jí)
  • 參與學(xué)習(xí)       51926    人
  • 解答問(wèn)題       422    個(gè)

幫助你深入前后端開(kāi)發(fā)留下的迷惑,為進(jìn)一步自學(xué)打下基礎(chǔ)

進(jìn)入課程

form表單設(shè)置enctype="multipart/form-data"后,電影保存Movie.js里save方法req.body.movie._id獲取不到

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)