.form文件_聊一聊multipart/form-data

cd15c2836f3bf27b8f8b9093954acd68.png

一、从表单中的 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--
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值