加 multiple 属性是启用多选的唯一前提,但仅添加该属性仍可能单选:需同时满足 type="file"、避免 capture 冲突、适配 iOS 16.4+、设置 enctype="multipart/form-data",且 FormData 必须用相同 key 多次 append 才能正确提交多文件。

加 multiple 属性是唯一前提,不加它,浏览器原生就禁止多选——JS 无法绕过这个限制。
为什么加了 multiple 还是只能选一个文件
常见原因不是代码写错,而是漏掉关键组合条件:
-
multiple必须和type="file"同时存在,单独写multiple对其他input类型(如text)完全无效 - 如果用了
capture属性(比如capture="user"),多数浏览器会自动禁用multiple,只允许调用摄像头或麦克风单次录制 - iOS Safari 16.4 以下版本会静默忽略
multiple,用户点击后仍弹出单文件选择器,检测方法是navigator.userAgent匹配iOS.*Version\/[0-9]+\.[0-3] - 表单提交时没设
enctype="multipart/form-data",文件数据根本不会发出去,看起来就像“没选上”
input.files 是类数组,不是数组
直接对 input.files 调 .forEach() 或 .map() 会报错 “not a function”,因为它是只读的 FileList 对象:
- 安全遍历方式:用
for (let i = 0; i ,或转成真数组 <code>Array.from(input.files) -
input.files不能被修改,input.files = []无效,清空选择只能靠input.value = '' - 每个
file是File实例,有name、size、type、lastModified,可用于校验,但file.size在超大文件(如 >2GB)下可能返回0 - 别用
JSON.stringify(input.files)——结果永远是{},FileList不可序列化
上传多个文件时 FormData.append() 的 key 名怎么写
后端收不到全部文件,90% 是因为 key 名写法和后端解析逻辑不匹配:
立即学习“前端免费学习笔记(深入)”;
- ✅ 正确做法:用相同 key 多次
append,例如formData.append('files', file1)、formData.append('files', file2) - ❌ 错误写法:传数组
formData.append('files', [file1, file2]),或试图用append('files[]', ...)——FormData不识别方括号语法 - 后端必须按“同名多值”解析:
Express + multer要用upload.array('files'),不是upload.single();PHP要遍历$_FILES['files']['name']数组,不能只取$_FILES['files']['name']字符串 - 调试时打开 Network 面板,看 Request Payload 里是否出现多个独立的
files条目,而不是合并成一个 blob
真正容易被忽略的是 iOS 16.4 以下的兼容性断层——它不报错、不警告,只是让 multiple 彻底失效。如果你的用户群体包含大量旧版 iOS 设备,仅靠前端 JS 拦截无法补救,必须做 UA 检测并提示降级方案。



















