form-data/x-www-form-urlencoded/raw/binary

来源:互联网 发布:淘宝没有安能物流 编辑:程序博客网 时间:2024/05/23 00:02

form-data

http请求中的multipart/form-data,他会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件的时候,会有Content-type表示文件类型;
不对字符编码!有boundary隔离,所以multipart/form-data 既可以上传文件,可以上传键值对。

这里写图片描述


那么到底什么是多部分媒体类型?
MIME中的 multipart 表示报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分是独立的,有各自的描述其内容的集;
不同部分之间用分界字符串连接在一起boundary~

多部分表格提交
当提交填写的HTTP表格时,变长的文本字段和上传的对象都作为 多部分主体(multipart Body )里面独立的部分发送,这样在表格就可以填写各种不同类型和长度的值。

HTTP使用Content-Type:multipart/form-data 或者 Content-Type:multipart/mixed这样的首部以及多部分主体来发送这种请求:
Content-Type:multipart/form-data;boundary=[asdasdsd]
boundary就是分割body(主体)中不同部分所用的字符串。

<form action="http://server.com/cgi" enctype="multipart/form-data" method="post"><p>xxx</p><input type="submit" value="Send"></form>

我们的用户代理可能会得到下面这样的数据:

------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="id"WU_FILE_0------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="name"Tulips.jpg------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="type"image/jpeg------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="lastModifiedDate"Tue Jul 14 2009 13:32:31 GMT+0800 (中国标准时间)------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="size"161781------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="chunks"2------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="chunk"0------WebKitFormBoundaryfyAzqkdimkhorKIoContent-Disposition: form-data; name="file"; filename="Tulips.jpg"Content-Type: application/octet-stream------WebKitFormBoundaryfyAzqkdimkhorKIo--

x-www-form-urlencoded

而application/x-www=form-urlencoded会将表单的数据转换为键值对,如:

name=java&age=23

这里写图片描述

在Request body中是这样的:

//headerContent-Type:application/x-www-form-urlencoed//bodyname1=valu1&name2=value2

Raw

可以上传任意格式的文本,text json xml html等
不会有任何编码或者Boundary分隔符。

Binary

相当于Content-Type:application/octet-stream
从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。


multipart/form-data 与 x-www-form-urlencoded的区别

前面也说过了
区别:

  • multipart/form-data是有一个内容分割符用于分割请求体中的多个POST内容,也就是分割前面的几个key值对应的内容:这可能是文件也可能是值
  • multipart/form-data最后会转为一条信息,请求body是字符串。
  • 而x-www-form-urlencoded是经过编码的,键值对是分隔开的(将空格转换为”+”符号,特殊字符转换为ASCII HEX值)
  • 还有一个重大的区别,是后台处理这两种类型的request body 是不同的。

对于 application/x-www-form-urlencoded

用这种方式请求,在后台接收的时候。可以直接从req.body获取这些key的值。 因为它是经过编码好的。所以是可以直接像这样来获取

var handle=function(req,res){    if(req.headers['content-type']==='application/x-www-form-urlencoded'){        req.body=querystring.parse(req.rawBody);    }};

解析一下,req.body现在就是一个对象了,
你可以像 req.body.username req.body.password这样访问获取键值。

对于 multipart/form-data

直接不能像这种方式解析,而要引入formidable模块

exports.uploadFile=function(req,res){    //console.log(hasBody(req));    //judging if len over the limit    var len=req.headers['content-length']?parseInt(req.headers['content-length'],10):null;    if(len&&len>bytes){        return res.status(413).end(); //res.writeHead    }//shoule save in somewhere    if(hasBody(req)){        if(mime(req)==='multipart/form-data'){            var form=new formidable.IncomingForm();            form.parse(req,function(err,fields,files){                req.body=fields;                req.files=files;                console.log("parsing..",req.body);                console.log(req.files);                return res.json({msg:'sucess',result:0});            })        }    }else{        console.log('No file uploading..');        return res.json({msg:'failed',result:1});    }}

主要是帮我们找到分隔符,然后分割开每个部分来解析,此时。
files是multipart/form-data中的文件
field是当中的字段。键的值
因为一个multipart/form-data其实可以理解为是fields和files的组合~ 这样分别即系比较好
这里写图片描述

这里我只上传了一个文件,可以发现对于field是一个空对象,因为我们没有键值。
而文件有,这是对文件的解析内容。


multipart/form-data分析:

http协议规定了以ASCII码传输,建立在TCP/IP协议之上,规范把http请求分为3个部分:状态行、请求头、请求体。
实现都是围绕如何运用和组织这三部分来完成的。
http协议本身原始方法不支持这种multipart/form-data请求,它利用post方法组合实现的.
请求头必须包含:Content-Type,值必须为multipart/form-data,同时规定一个内容分割符用于分割请求体中的多个post内容

构造方式不同
multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。

0 0