概述
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>
我们的用户代理可能会得到下面这样的数据:
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="id"
WU_FILE_0
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="name"
Tulips.jpg
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="type"
image/jpeg
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="lastModifiedDate"
Tue Jul 14 2009 13:32:31 GMT+0800 (中国标准时间)
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="size"
161781
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="chunks"
2
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-Disposition: form-data; name="chunk"
0
------WebKitFormBoundaryfyAzqkdimkhorKIo
Content-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中是这样的:
//header
Content-Type:application/x-www-form-urlencoed
//body
name1=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则是添加了分隔符等内容的构造体。
最后
以上就是呆萌玫瑰为你收集整理的form-data/x-www-form-urlencoded/raw/binary的全部内容,希望文章能够帮你解决form-data/x-www-form-urlencoded/raw/binary所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复