一、从表单中的 enctype说起
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
1、enctype有三种类型
application/x-www-urlencoded:数据被编码成以'&'
分隔的键-值对, 同时以'='
分隔键和值. 非字母或数字的字符会被 百分比编码(percent-encoding)
- multipart/form-data:不做编码,发送二进制数据
- text-plain:空格转换为 "+" 加号,但不对特殊字符编码
2、需要明确几点
- enctype默认是application/x-www-urlencoded;
- GET请求会采用ASCALL编码,并附在url地址后面发送到服务端;但是发送的数据大小有限制;
- 发送较大数据采用POST请求,通过body发送。但是发送二进制数据时,用三个字符表示一个二进制,传送数据较原文件大很多。所以发送二进制或者非ASCALL(no-ascll)适合采用multipart/form-data
二、关于multipart/form-data
1、在1995年,ietf 出台了 rfc1867,也就是《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。Content-Type 的类型扩充了multipart/form-data 用以支持向服务器发送二进制或者非ASCALL(no-ascll)数据。
2、multipart/form-data重要规范特征
- 必须post方式发送数据;
- Content-Type格式为multipart/form-data; boundary=${boundary}。满足条件的提交,浏览器会自动创建boundary。例如chrome和safari浏览器,自动创建的boundary格式像下面这个样子,其中boundary是长度为16的随机base64字符。
----WebKitFormBoundary${boundary}
例如:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary222BPd3etU0TLTOv
- 发送数据内容以------WebKitFormBoundary?${boundary}作为起始标记和分隔符、终结标记多了“--”;数据内容主要包括:Content-Disposition、Content-Type、数据内容等;其中数据内容前面有nr标记的空行;Content-Disposition是必选项,其它都是可选项;Content-Disposition 包含了 type 和 一个名字为 name 的 parameter,type 是 form-data,name 参数的值则为表单控件(username)的名字,如果是文件,那么还有一个 filename 参数,值就是文件名。
例如:
------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="name"
------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="time"
1586232882192
------WebKitFormBoundarywKADO5urZL0xelAF
Content-Disposition: form-data; name="f"
[object FileList]
------WebKitFormBoundarywKADO5urZL0xelAF--