multiple属性必须添加,否则浏览器原生限制仅允许单文件选择;name需为files[]以使后端正确接收为数组,enctype必须为multipart/form-data且method为post。

multiple 属性必须加,否则浏览器只允许选一个文件——这不是 JS 能补救的限制,是原生行为。
HTML 表单里 <input type="file"> 必须带 multiple 和正确 name
用户点一次只能选一个文件?大概率是漏写了 multiple。它不是可选项,是多文件上传的开关:
-
<input type="file" name="files[]" multiple>是最稳妥写法:加了multiple启用多选;name="files[]"让 PHP 自动收为数组,Node.js 的 multer 也能对上upload.array('files') - 别写
name="files"(不带方括号):PHP 会把多个文件的name、tmp_name等字段平铺覆盖,最后只剩最后一个文件的信息 -
accept只过滤类型,不影响多选能力,别指望它限制数量 - 表单
enctype必须是"multipart/form-data",method必须是POST,缺一不可
JavaScript 读取多个文件时,input.files 不是数组
直接对 input.files 调 .forEach() 会报错 “not a function”,因为它是 FileList,类数组但没数组方法:
- 安全转数组:用
Array.from(input.files)或[...input.files] - 预览图片时,每个
File需单独创建FileReader,监听load后赋值给<img src> - 用完
URL.createObjectURL(file)后,记得在不需要时调URL.revokeObjectURL(url),否则内存泄漏 - 大文件别全量读进内存:
file.slice()分块或直接走 FormData 上传更稳
后端只收到第一个文件?大概率是解析逻辑错了
前端传了 5 个文件,后端只处理了第 1 个——问题不在 HTML,而在服务端怎么取数据:
- Express + multer:必须用
upload.array('files'),不是upload.single(),也不是req.file(那是单文件用的) - PHP:
$_FILES['files']是个二维结构,name、tmp_name、size各自是数组,得用for ($i = 0; $i 遍历 - 如果表单里还有其他字段(比如
<input name="title">),它们会和文件一起在multipart/form-data中提交,不会丢,但必须确保后端解析 multipart 的中间件已启用
iOS Safari 多文件上传在 16.4 以下版本实际失效
用户说“点了半天还是只能选一个”,检查下设备系统版本——iOS 16.4 之前,Safari 的 <input type="file" multiple> 会静默忽略 multiple,既不报错也不支持多选:
- 没有降级方案:不能靠 JS 模拟多次点击来绕过,系统级限制
- 能做的只有检测 UA + iOS 版本,提示用户升级或改用其他浏览器(如 Chrome for iOS)
- 这个坑特别隐蔽,因为桌面 Safari、Android 浏览器、新版 iOS Safari 都正常,唯独旧版 iOS Safari 假正常
真正卡住人的地方,往往不是怎么写 multiple,而是后端没按数组结构去遍历,或者在 iOS 16.3 上测了半天以为是代码问题,其实是浏览器根本没转发多文件数据。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











