使用formidable模块包装POST请求

准备

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,004评论 25 708
  • 一师姐过生日,我们闹得很晚才回来,本来很开心的事,总能隐约的觉察到她一丝丝愁意,是的,往年的生日,都有她老公陪在身...
    Zendy阅读 211评论 2 5
  • 早上好!#幸福实修#~每天进步1%#幸福实修12班-02-骆金芳--富阳# 20170930(5/60) 【幸福三...
    幸福实修金芳阅读 217评论 0 2
  • 刚刚看了一篇关于简述杨绛先生一生的微博,感触很深,且解决了一些的心中疑问: 1.如何保持一生不变?每当踌然,回望初...
    怀山柔水阅读 639评论 0 0