美文网首页f2e-server
使用formidable模块包装POST请求

使用formidable模块包装POST请求

作者: 云香水识 | 来源:发表于2014-12-30 21:38 被阅读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。

    相关文章

      网友评论

        本文标题:使用formidable模块包装POST请求

        本文链接:https://www.haomeiwen.com/subject/evkztttx.html