表单提交文件时enctype必须设为multipart/form-data,否则浏览器不打包文件内容;application/x-www-form-urlencoded仅支持文本编码,无法传输二进制数据;text/plain极少使用且不支持文件上传。

表单提交文件时,enctype 必须设为 multipart/form-data,否则 <input type="file"> 的文件内容根本不会发到服务端——不是后端收不到,是浏览器压根不打包。
application/x-www-form-urlencoded 是默认值,但只适合纯文本
这是所有 <form></form> 不写 enctype 时的隐式行为。浏览器会把所有字段(包括 name、value)转成 URL 编码格式,例如空格变 %20,中文变 %E4%BD%A0 等。它不支持二进制数据,所以:
-
<input type="file">提交后,request.body里只有文件名字符串,没有文件内容 - 服务端用
req.body或request.form只能拿到空或乱码,request.files为空 - 即使后端用了
multer、flask.request.files或HttpServletRequest.getPart(),也拿不到东西——因为请求体里根本没传
multipart/form-data 是上传文件的唯一正确取值
它把整个请求体切分成多个部分(parts),每个字段一个 part,文件字段会带上原始二进制流、Content-Type 和文件名。关键点:
- 必须搭配
method="POST";GET请求不支持该编码 - 浏览器自动添加
boundary分隔符,服务端解析器(如multer)靠它识别各字段边界 - 如果手动拼
FormData并用fetch提交,不设Content-Type头——浏览器会自动生成带正确boundary的头,设了反而出错 - ASP.NET Web Forms 中,
HtmlForm.Enctype属性设为"multipart/form-data"后,Request.Files才有数据
text/plain 几乎没人用,仅调试可见
这个值会让浏览器以纯文本方式拼接字段,空格保留、不编码、不加引号。比如输入 name=张三&city=北京,就原样发过去。但它:
- 不被主流框架(Express、Flask、Django、Spring)原生支持解析
- 无法携带文件,
<input type="file">提交后仍为空 - 实际项目中基本只在手动构造请求、抓包验证或绕过某些前端校验时临时出现
真正容易被忽略的是:哪怕只加了一个 <input type="file">,整个表单都得切到 multipart/form-data;混用文本字段和文件字段时,不能给部分字段单独指定编码——enctype 是表单级属性,作用于整个 <form></form>。











