multiple属性仅在type="file"时生效,需配合enctype="multipart/form-data"和name="files[]"才能上传多文件;ios safari 16.4前不支持,javascript须用array.from(input.files)处理filelist。

multiple 属性必须和 type="file" 一起用才生效
单独写 multiple 或套在 type="text" 上完全无效。只有 <input type="file" multiple> 这种组合才能触发系统级多选对话框。浏览器看到这个组合,才会允许用户按住 Ctrl(Windows)或 Cmd(macOS)点选多个文件,或直接拖拽一批文件进输入框区域。
iOS Safari 16.4 之前根本无视 multiple
用户说“点了还是只能选一个”,先查 UA:如果 navigator.userAgent 包含 iPhone 且系统版本号是 OS 16_3 或更早,那不是你代码问题——是 Safari 原生不支持,input.files.length 永远为 1,也不报错。Android 主流浏览器基本没问题,但某些国产定制系统会静默降级。
JavaScript 必须读 input.files,别碰 value
input.value 只返回类似 C:\fakepath\photo.jpg 的伪造路径,且永远只反映第一个文件;真正承载全部文件的是只读的 input.files(FileList 对象)。常见错误包括:
- 直接对
input.files调用.forEach()→ 报TypeError: not a function - 没检查
input.files.length就访问input.files[0]→ 用户没选时崩溃 - 用
JSON.stringify(input.files)想调试 → 得到空对象,因为FileList不可序列化
安全做法是:const files = Array.from(input.files),再遍历处理每个 File 实例(它有 name、size、type、lastModified)。
form 提交多文件必须配 enctype 和 name 数组语法
光有 multiple 不上传,只是打开选择通道。要真正发出去,两个条件缺一不可:
-
<form enctype="multipart/form-data"></form>—— 没这个,文件数据压根不会进请求体 -
<input type="file" name="files[]" multiple>——[]告诉 PHP 等后端这是数组;Node.js Express 需配合upload.array('files')解析
漏掉任一,后端要么收不到文件,要么只拿到最后一个。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











