加 multiple 属性仅开启多选,不解决并发与性能问题;需禁用 auto-upload、手动分批上传,注意 FormData 用法、PHP 限制及 iOS Safari 兼容性。

加了 multiple 属性,上传一卡一卡的,不是前端卡就是后端挂,根本不是“加个属性就完事”——它只管打开多选开关,后续所有性能问题都得你主动拆解。
为什么 el-upload 或原生 input + multiple 会并发爆炸?
浏览器对同一域名的并发请求数有限制(HTTP/1.1 通常 6–8 个),el-upload 默认开启 auto-upload 后,每个文件都会立即发起独立请求。选 20 个文件?瞬间塞满连接池,后面请求排队、超时、失败率飙升。
- ✅ 正确做法:禁用
auto-upload,手动收集input.files,再批量构造单个请求或分批发送 - ❌ 别依赖 UI 组件默认行为——尤其在移动端或弱网环境下,它不会自动降级或限流
- ⚠️ 注意:Vue 3 的
el-upload中http-request钩子必须 return Promise,否则上传队列会混乱
FormData.append('files', file) 和 append('files[]', file) 有区别吗?
没区别。PHP 接收多文件只认 key 名是否带 [] 后缀,而 FormData 本身不解析数组语法——它只是把多个同名 key 当作独立条目塞进请求体。
- ✅ 必须对每个
File对象单独调用formData.append('files', file) - ❌ 不要
formData.append('files', input.files)——FileList不是Blob,Chrome 可能凑合,Firefox 直接丢数据 - ? 调试时看 Network → Request Payload,确认每个文件是否为独立 part,而不是一个空 blob 或乱码
为什么上传大文件时 PHP 报 “exceeds memory_limit” 或 “upload_max_filesize”?
因为 PHP 默认把整个文件读进内存处理,哪怕你只是想存到磁盘。更糟的是,$_FILES 的结构会让多个大文件叠加触发限制。
- ✅ 前端先做大小拦截:
if (file.size > 50 * 1024 * 1024) { /* 拒绝 */ } - ✅ 后端必须二次校验:
$_FILES['files']['size'][$i] > 50 * 1024 * 1024,不能只查总数 - ⚠️
upload_max_filesize是单文件上限,post_max_size才是整次请求总上限,两者都要调大 - ? 真正的大文件(>10MB)建议走分片上传,PHP 侧用
file_put_contents($path, file_get_contents($_FILES['file']['tmp_name']), FILE_APPEND)接续写块
最常被忽略的点:iOS Safari 16.3 及更早版本会静默忽略 multiple,input.files.length 永远是 1。检测逻辑不能只靠 input.multiple 属性,得结合 navigator.userAgent 做兼容兜底。


















