f2e-server

使用formidable模块包装POST请求

2014-12-30  本文已影响858人  云香水识

准备

使用 $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。

上一篇下一篇

猜你喜欢

热点阅读