准备
使用 $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
})%>
结果
PS:
相关完整代码已经发布到了npm仓库中, 可以使用 $npm install http-f2e-server@0.0.8
进行安装或者更新。进入目录后使用 $node http-f2e-server.js
启动服务,并查看Demo。