multipart/form-data的使用注意

博客讨论了在HTTP请求中multipart/form-data的使用场景,特别是在文件上传和AJAX提交数据时。它解释了Content-Type头的不同类型,强调multipart/form-data用于二进制数据传输,并指出使用FormData对象时,浏览器会自动处理Content-Type。最后,提到了服务端如何通过boundary解析multipart/form-data数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

事情是这样的,我在使用ajax+FormData对象提交数据的时候,使用request.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 但服务端接受的数据却是multipart/form-data编码的,还自带boundary。

在这里插入图片描述

Form的三种encrypt

  • application/x-www-urlencoded
  • multipart/form-data
  • text-plain

首先,encrypt属性值是在http传输数据位于http头部Content-Type的,并且只是客户端提交数据有效,服务端不使用这几个值。客户端接收到这几个值会自动忽略(浏览器)。

在1995年,ietf 出台了 rfc1867,也就是《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。所以 Content-Type 的类型扩充了multipart/form-data 用以支持向服务器发送二进制数据。因此,发送 POST 请求时候,表单 属性 enctype 共有二个值可选,这个属性管理的是表单的 MIME 编码:

① application/x-www-form-urlencoded (默认值)
② multipart/form-data
注:form 表单中 enctype 的默认值是 enctype=“application/x- www-form-urlencoded”.

Example

application/x-www-urlencoded

POST http://127.0.0.1/login.do HTTP/1.0
Accept: image/gif, image/jpeg, image/pjpeg, */*
Accept-Language: en-us,zh-cn;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-Length: 28
 
username=admin&password=1234

multipart/form-data

PS C:\Users\Administrator\Desktop\Projects\poemServer\src\serve\golang> go run .\main.go
multipart/form-data; boundary=----WebKitFormBoundaryKIziqjuNgPfCj1Mw
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemname"

1234
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemclass"

叙事诗
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poetname"

4567
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemhist"------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemtags"

豪迈;不羁
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="conditionlogical"

与或非
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_kaipianci"

a
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_content"

w
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_comment"

s
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_history"

d
------WebKitFormBoundaryKIziqjuNgPfCj1Mw--

然后再在服务端对数据进行解析,使用boundary来split操作,如golang的http.Request.ParseMultipartForm操作。

总结

  1. 这几个字段是用来http向服务端提交数据用的。
  2. multipart/form-data存在的意义在于一定程度上减少cs交互数, 一个连接请求发送多部分content,支持二进制传输
  3. 对于默认application/x-www-urlencoded编码。
  4. 对于FormData只支持multipart/form-data编码,并且不需要设置Content-Type,自动设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值