準備
使用 $npm install http-f2e-server@0.0.6
進行安裝之前版本,本篇在此基礎上使得POST請求的文件數據處理結果類似GET請求。
添加formidable依賴
修改package.json文件添加formidable依賴。由于之前版本忘記添加underscore依賴,本次加上結果如下:
"dependencies": {
"mime": "1.2.11",
"underscore": "1.7.0",
"formidable": ">=1.0.15"
},
npm install
安裝formidable。
主流程添加入口
if( req.method === "POST" ){ // POST請求
rs.on("end",function(){
require("./lib/post").execute(str, root, req, resp);
});
}
將resp傳遞進去以備操作輸出給客戶端。
創建formidable對象并且解析request
var form = new formidable.IncomingForm(),
files = [],
fields = {};
form.uploadDir = req.data.uploadUrl
? ( root + "/" + req.data.uploadUrl + "/" )
: path.join( __dirname + "/tmpl/" ); //上傳路徑沒有傳遞的時候, 默認
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});
}
})
解析完成時:
對上傳文件進行重命名,同時POST數據結果綁定在request上。
form.on('end', function() { //字段和文本都保存結束后
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上, 可以在模板頁面使用
req.files = files; //文件基本信息也保存在request.files上
resp.end( _.template(str)({require: require,request:req,response:resp}) );
});
測試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>
目標代碼 example/post.json
<%=JSON.stringify({
get: request.data,
post: request.post,
files: request.files
})%>
結果
post.png
PS:
相關完整代碼已經發布到了npm倉庫中, 可以使用 $npm install http-f2e-server@0.0.8
進行安裝或者更新。進入目錄后使用 $node http-f2e-server.js
啟動服務,并查看Demo。