multiple属性仅对生效,加后即可原生支持ctrl/cmd多选或拖拽多文件;需用input.files(filelist)而非value读取,javascript须转为数组处理;ios safari 16.4前不支持。

multiple 属性本身就能开启文件多选,但仅限 <input type="file">
加了 multiple 就能按住 Ctrl(Windows)或 Cmd(macOS)点选多个文件,或者直接框选、拖入多个文件——浏览器原生支持,不需要 JS 额外干预。常见错误是以为加了属性还得手动绑定事件才能读取多个文件,其实不是。
关键点:
-
input.files返回的是FileList对象(类数组),不是单个File,遍历时要用for或Array.from(input.files) - 若用
input.addEventListener('change', ...),event.target.files也同样是FileList - 不支持 IE9 及更早版本;IE10–11 支持
multiple,但不支持拖拽多文件上传
用 FormData 上传多个文件时,字段名要带 [] 吗?
不带 [] 也能传,但后端接收逻辑可能出问题。比如:
const fd = new FormData();
for (const file of input.files) {
fd.append('files', file); // 字段名重复:files → 后端收到多个同名值
}
PHP 会收到 $_FILES['files']['name'] 是数组;Node.js 的 multer 默认也支持同名多次 append,解析为数组。但有些框架(如某些 Java 或 Python 库)默认只取第一个。稳妥做法是显式用数组语法:
- 前端写
fd.append('files[]', file)(兼容性更好,尤其对 PHP) - 或统一用
fd.append('files', file),但后端必须明确按多值方式解析 - 避免混用:不要一部分 append
'files',一部分 append'files[]'
为什么选中多个文件后 input.files.length === 0?
典型原因是表单被重置过,或者 input 被 JS 重新赋值了 value = ''。注意:input.value = '' 会清空 files,但不会触发 change 事件;而用户手动取消选择,files 也会变为空。
- 不要用
input.value = ''清空文件输入框——改用input.type = 'text'; input.type = 'file'(有副作用,慎用)或克隆节点 - 检测是否真的有文件:优先用
input.files && input.files.length > 0,别只判input.files是否存在 - 移动端 Safari 对
multiple支持有限:iOS 12+ 才真正支持多选,旧版只能单选
上传前预览多个图片,URL.createObjectURL() 用完要释放吗?
要。每个 createObjectURL() 会创建一个内存引用,不释放会导致内存泄漏,尤其用户反复选图时。
- 预览时保存返回的 URL 字符串,用于
<img src> - 下次重新选图前,先对旧 URL 调用
URL.revokeObjectURL(oldUrl) - 页面卸载前(
beforeunload)可批量清理,但更推荐“用完即清”策略 - 注意:
revokeObjectURL不影响已加载的图片显示,只是断开内存引用
多文件上传的核心约束不在 HTML 层,而在后端接收能力、网络稳定性、以及用户对上传进度和错误的感知。把 multiple 当起点,而不是终点。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











