加multiple属性是启用多文件上传的唯一前提,否则即使按ctrl多选也仅提交首个文件;常见失效原因包括:未显式添加于file类型input、form缺少enctype="multipart/form-data"、ios safari 16.3及更早版本静默忽略该属性。

加 multiple 属性是唯一前提,不加它,其他所有操作都无效——哪怕用户按住 Ctrl 多选,浏览器也只提交第一个文件。
为什么加了 multiple 还是单选?
常见硬性遗漏点:
-
multiple必须显式写在<input type="file">上,<input type="text" multiple>完全无效 -
<form></form>标签没设enctype="multipart/form-data",文件数据根本不会发出 - 表单
method不是POST,GET 无法携带文件 - iOS Safari 16.3 及更早版本会静默忽略
multiple,input.files.length永远为 1,无任何报错提示
input.files 和 input.value 别混用
input.value 只返回第一个文件的伪造路径(如 C:\fakepath\photo.jpg),对多选毫无意义;真正承载全部文件的是只读的 input.files,它是一个 FileList 对象:
- 检查是否选了文件:用
input.files.length,别直接取input.files[0] - 转成真数组再处理:
Array.from(input.files),之后才能用forEach、map等方法 - 每个
File实例有name、size、type、lastModified字段,可用于校验 - 别
JSON.stringify(input.files)——结果是空对象,因为FileList不可序列化
用 FormData 上传多个文件必须同 key 多次 append()
后端收不到全部文件,90% 卡在这步:
- ❌ 错误:
formData.append('file', file)循环多次 → 后端只收到最后一个 - ✅ 正确:
formData.append('files', file)对每个文件都调用一次,key 名一致 - 后端需按「同名多值」解析:Express 用
upload.array('files'),PHP 遍历$_FILES['files']['name']数组 - 别手动设置
Content-Type请求头,浏览器会自动生成正确的multipart/form-databoundary - 调试时务必看 Network 面板的 Request Payload,确认每个文件是否作为独立条目列出
移动端兼容性仍是最大盲区:iOS Safari 16.4 才真正支持,此前版本无论怎么写都 fallback 到单选;Android 主流浏览器支持良好,但部分厂商定制系统可能拦截拖拽或限制数量。别把“用户说选不了”直接归因于代码,先查 UA 和系统版本。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











