準(zhǔn)備
使用 $npm install http-f2e-server@0.0.6
進(jìn)行安裝之前版本,本篇在此基礎(chǔ)上使得POST請(qǐng)求的文件數(shù)據(jù)處理結(jié)果類似GET請(qǐng)求调榄。
添加formidable依賴
修改package.json文件添加formidable依賴柬帕。由于之前版本忘記添加underscore依賴产场,本次加上結(jié)果如下:
"dependencies": {
"mime": "1.2.11",
"underscore": "1.7.0",
"formidable": ">=1.0.15"
},
npm install
安裝formidable。
主流程添加入口
if( req.method === "POST" ){ // POST請(qǐng)求
rs.on("end",function(){
require("./lib/post").execute(str, root, req, resp);
});
}
將resp傳遞進(jìn)去以備操作輸出給客戶端拗慨。
創(chuàng)建formidable對(duì)象并且解析request
var form = new formidable.IncomingForm(),
files = [],
fields = {};
form.uploadDir = req.data.uploadUrl
? ( root + "/" + req.data.uploadUrl + "/" )
: path.join( __dirname + "/tmpl/" ); //上傳路徑?jīng)]有傳遞的時(shí)候, 默認(rèn)
form.parse(req);
在解析事件中添加字段和文件
如果是空文件廓八,不保存
form.on('field', function(field, value) { //處理字段
fields[field] = value;
}).on('file', function(field, file) { //處理文本
if( file.size ){
files.push({name: field, file: file});
}
})
解析完成時(shí):
對(duì)上傳文件進(jìn)行重命名,同時(shí)POST數(shù)據(jù)結(jié)果綁定在request上赵抢。
form.on('end', function() { //字段和文本都保存結(jié)束后
files.map(function(file){
fs.rename(file.file.path, form.uploadDir + file.file.name, function (err) {
if(err){ throw err; }
});
});
req.post = fields; //字段保存在request.post上, 可以在模板頁(yè)面使用
req.files = files; //文件基本信息也保存在request.files上
resp.end( _.template(str)({require: require,request:req,response:resp}) );
});
測(cè)試Demo
<fieldset>
<lengend>表單提交</lengend>
<form action="post.json" method="post" enctype="multipart/form-data">
<label>用戶名:</label> <input type="text" name="name"> <br>
<label>頭像上傳:</label> <input type="file" name="icon"> <br>
<input type="submit" value="提交">
</form>
</fieldset>
目標(biāo)代碼 example/post.json
<%=JSON.stringify({
get: request.data,
post: request.post,
files: request.files
})%>
結(jié)果
post.png
PS:
相關(guān)完整代碼已經(jīng)發(fā)布到了npm倉(cāng)庫(kù)中剧蹂, 可以使用 $npm install http-f2e-server@0.0.8
進(jìn)行安裝或者更新。進(jìn)入目錄后使用 $node http-f2e-server.js
啟動(dòng)服務(wù)烦却,并查看Demo宠叼。