必须设置 enctype="multipart/form-data" 和 method="post",否则文件数据根本不会发送;input[type="file"] 多选需用 multiple 布尔属性;formdata 上传多文件须用相同 key 多次 append;大文件需分片上传,原生表单无进度控制。

必须写对 enctype="multipart/form-data" 和 method="POST",否则后端收不到任何文件数据——这不是兼容性问题,是协议级硬性要求。
form 标签上漏掉 enctype 属性会怎样
浏览器根本不会把文件内容塞进请求体。后端收到的 request.files(或等效对象)永远为空,连日志都看不到字段名。不是“解析失败”,而是“压根没发”。application/x-www-form-urlencoded 会静默丢弃二进制部分,只传一个 C:\fakepath\xxx.jpg 这类占位字符串。
-
enctype必须显式写在<form></form>标签上,不能靠 JS 动态补,也不能指望浏览器自动 fallback - 写成
enctype="text/plain"或enctype="application/json"同样无效,这些值不支持 multipart 分块 - 如果用 fetch + FormData 提交,绝不能手动 setRequestHeader('Content-Type'),否则浏览器生成的
boundary会被覆盖,后端直接拒收
input type="file" 的 multiple 属性怎么用才生效
只对 type="file" 有效,且必须是布尔属性写法:<input type="file" multiple>。加在其他类型上、带值(如 multiple="false")、或缺 type 都等于没写。
- 用户多选方式:Windows 按 Ctrl + 点击,macOS 按 Cmd + 点击;Chrome/Edge/Firefox 支持拖拽多个文件到 input 区域
- iOS Safari 在 16.4 之前基本不支持多选,点开仍是单文件对话框
- JS 里别读
input.value,它只返回第一个文件的伪造路径;真正要处理的是input.files,一个只读FileList对象
上传多个文件时 FormData.append() 容易踩的坑
后端只收到最后一个文件?大概率是 key 名写错了。用同名多次 append() 才能被后端识别为数组,而不是覆盖。
- ❌ 错误:
formData.append('file', file)循环调用 → Express/Django/PHP 默认只留最后一个 - ✅ 正确:
formData.append('files', file)每个文件都调一次,key 保持一致(推荐复数形式,如files) - 不要写成
files[],PHP 外的大多数框架(包括 fetch、Express、FastAPI)不依赖这种命名约定,反而容易解析失败 - 上传前可用
Array.from(input.files)转成真数组,方便做 size/type 校验或并发控制
大文件上传不能只靠表单提交
enctype="multipart/form-data" 解决的是“能不能发”,不是“稳不稳定”。浏览器会把整个文件读进内存再打包,500MB+ 就可能触发 RangeError: Maximum call stack size exceeded 或卡死。
- 真实场景下,大文件必须分片:
file.slice(start, end)+ fetch 并发上传 + 服务端按序合并 - 原生表单没有进度监听、断点续传、暂停/重试能力,这些得靠 JS 自行实现
- accept 属性(如
accept="image/*")只是 UI 提示,不能替代服务端 MIME 类型和扩展名校验
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











