解析分类数据

表单的字段有两种,一个是表单字段,一个是二进制的文件。而这两种格式的不同在于信息头,下面是个信息头的例子:

表单字段信息头

Content-Disposition: form-data; name="title" \r\n\r\n

二进制文件信息头

Content-Disposition: form-data; name="img"; filename="favicon2.ico" \r\n
Content-Type: image/x-icon \r\n\r\n

解析过程要分别处理,最终要把表单字段的信息,解析后放入 req.body 。把上传文件的信息,保存在req.files中。下面是解析代码:

// 头信息和体信息的之间分割字符串
var RN = "\r\n\r\n";

var files = {};   // 储存解析出的上传文件的信息

var bodys = {};   // 储存表单字段的信息

fields.forEach(function(field){

    var index  = field.indexOf(RN);

    // 解析出头信息块
    var header = field.substring(0,index);

    // 从头信息中解析出表单字段的名称,也就是表单的name属性值。
    /name=\"(.*?)\"/g.test(header);
    var fieldName = RegExp.$1;

    // 判断是上传的文件,还是一般的表单字段。
    var isFile = /filename/g.test(header);

    // 解析出数据体
    var body = field.substring(index+RN.length);
        body = body.substring(0,body.length - RN.length/2);

    if(isFile){
        files[fieldName] = new Buffer(body);
    }else{
        bodys[fieldName] = body;
    }

})

代码中把二进制上传文件信息保存到files里,一般的表单字段信息保存到bodys中。通过 new Buffer(字符串) 的方式转换成二进制对象。

下一节,要把这些代码整合一下,集成到post.js中间件里。