此前的文章中,我们介绍了 http 协议的基本内容。 HTTP 协议简介 事实上,HTTP 协议并不仅仅包含这些内容,例如我们本文中将会介绍的 multipart/form-data 就是常见的一种 http 请求,他通常用来实现文件的上传功能。
在 1995 年出台的 rfc1867 协议中,HTTP 协议的 Content-Type 扩充了 multipart/form-data 类型用以支持向服务器发送二进制数据,以便可以在 POST 请求中实现文件上传等功能。 在 html 中,如果 <form> 表单标签中增加 enctryp="multipart/form-data" 属性,那么这个表单就会将提交请求中的 Content-Type 设置为 multipart/form-data。
<form method="post" action="http://test.techlog.cn/upload.do"
enctype="multipart/form-data">
<inputtype="text" name="desc">
<inputtype="file" name="pic">
</form>
这个表单提交时,header 如下:
POST /t2/upload.do HTTP/1.1
User-Agent: TechlogWapRebot
Accept-Language: zh-cn,zh;q=0.5
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Length: 60408
Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Host: test.techlog.cn
boundary 指定的是分割符,用户可以自由指定,但建议尽量复杂一些,以免与请求正文中文本发生冲突,上面的 ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC 就是浏览器所指定的分割符。
请求体会被认为是二进制字符串,并使用 —ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC 来进行分割:
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="desc"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name="pic"; filename="photo.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
[图片二进制数据]
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--
Multipart/form-data POST文件上传详解 — http://blog.csdn.net/xiaojianpitt/article/details/6856536。