多部分对象集合(Multipart)
发送邮件时,我们可以在邮件里写入文字并添加多份附件,这是因为采用了 MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制中的一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据;
即多部分对象集合(Multipart)允许邮件处理文本、图片、视频等多个不同类型的数据;
例如:图片等二进制数据以 ASCII 码字符串编码的方式指明;
相应地,HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多种类型实体,通常是在图片或文本文件等上传时使用;
此时报文的 Content-Type 值为(报文主体的MIME 类型):multipart/form-data; boundary=something;
multipart/form-data类型的报文主体包含多种类型实体,每个实体主要构成分为如下部分:
边界线;
通过媒体类型的可选参数指定;
例如:
multipart/form-data; boundary=----WebKitFormBoundarybi5XUwMxC7yc9s5a;
boundary 字符串用来划分多部分对象集合指明的各类实体,但是在 boundary 字符串之前还会插入“--”标记;
当前实体首部
包含 content-disposition和content-type,content-type出现在文件上传的时候;
还有一个空行用于表示当前实体首部的结束;
内容区域;
即实体内容(主体)
在多部分对象集合的最后,会插入“--boundary--”标记(例如:--AaB03x--、--THIS_STRING_SEPARATES--)作为多部分对象集合的结束;
例如:
<form action="http://localhost:8000/" method="post" enctype="multipart/form-data"> <input type="text" name="myTextField"> <input type="checkbox" name="myCheckBox">Check</input> <input type="file" name="myFile"> <button>Send the file</button> </form>
POST / HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498 Content-Length: 465 -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myTextField" Test -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myCheckBox" on -----------------------------8721656041911415653955004498 Content-Disposition: form-data; name="myFile"; filename="test.txt" // 描述内容的基础配置 Content-Type: text/plain // 描述了上传的文件类型 Simple file. -----------------------------8721656041911415653955004498-- |
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x Content-Disposition: form-data; name=“field1”
Joe Blow --AaB03x Content-Disposition: form-data; name=“pics”; filename=“file1.txt” Content-Type: text/plain
…(file1.txt的数据)… --AaB0x-- |
另外,可以在某个实体中嵌套使用多部分对象集合;