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的就表示有文件上传。