http的multipart协议

html里post一个form表单,通常这么写:

<form method="POST" action="http://www.example.com/upload/" enctype="application/x-www-form-urlencoded">
    ....
</form>

这里的enctype="application/x-www-form-urlencoded"为默认值,可以不写。enctype有如下几种取值:

1. text/plain 对POST内容不进行编码,只是将空格转换为+号

2. application/x-www-form-urlencoded 浏览器的默认编码,即进行urlencode编码,除空格转换为+号,特殊字符转换成%xx,包括汉字。

3. multipart/form-data 上传文件或者二进制时,必须使用些编码

表单提交无非是要将一项一项的key和value告知服务端,但文本上传时,由于内容各式各样,千差万别,无法保证内容和其他的key和value不产生混淆,所以就需要设计一种格式,将每一项key和value进行分隔,便于服务端解析而不会发生混淆。multipart就是为此设计的。

在上传的http请求里,header中会有这么一项:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryrnXirzEGQDpmDjIF

其中boundary是一串随机值,接着就是http的body部分,举例如下:

------WebKitFormBoundaryrnXirzEGQDpmDjIF
Content-Disposition: form-data;name="pic"; filename="photo.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

...
------WebKitFormBoundaryrnXirzEGQDpmDjIF
Content-Disposition: form-data; name="cmd"

Picture.getList
------WebKitFormBoundaryrnXirzEGQDpmDjIF
Content-Disposition: form-data; name="offset"

0
------WebKitFormBoundaryrnXirzEGQDpmDjIF
Content-Disposition: form-data; name="limit"

20
------WebKitFormBoundaryrnXirzEGQDpmDjIF--

每一项都以--加boundary分隔,末尾以--加boundary加--结尾。每项都有一个Content-Disposition头,表示key的名字,接着\r\n\r\n之后,就是value的值,也不需要进行urlencode编码。当然带filename的就表示有文件上传。

发表于 2018-01-21 22:12   评论:1   阅读:363  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo