multiple属性必须显式写在HTML中(如<input type="file" multiple>)才生效,JS设置input.multiple = true或setAttribute('multiple', '')无效;仅对type="file"有效,需配合enctype="multipart/form-data"和后端数组解析逻辑。

file input 的 multiple 属性必须显式写在 HTML 中
加了 multiple 才能多选,但只靠 JS 设置 input.multiple = true 或 setAttribute('multiple', '') 不生效——浏览器只认原始 HTML 里有没有这个属性。写成 <input type="file" multiple> 是唯一稳妥写法。<input type="file" multiple="true"> 在 Safari 旧版或某些解析器下可能被忽略,<input type="file" multiple=""> 则不符合 XHTML 规范,容易出兼容性问题。
accept 属性和 multiple 可共存但不强制过滤
accept 只影响文件选择弹窗的默认筛选视图(比如只显示图片),它不阻止用户手动切换到“所有文件”并选中非匹配类型。常见错误是以为写了 accept=".pdf,.docx" 就能杜绝其他格式上传——实际仍需后端校验 MIME 类型和扩展名。移动端尤其要注意:iOS Safari 直到 16.4 才支持 accept 的部分值,且对逗号分隔的列表支持不稳定,建议优先用 accept="application/pdf" 这类标准 MIME 类型。
表单提交时多文件必须配 enctype="multipart/form-data"
没设 enctype="multipart/form-data",浏览器会把 input[type="file"] 当普通文本字段提交,后端收到的是空字符串或文件名(非二进制数据)。同时,服务端接收逻辑要按数组处理:req.files(Express + multer)、$_FILES(PHP)、或 request.files.getlist('files')(Flask)——不能只取 request.files['files'],否则只拿到第一个文件。
JavaScript 读取 FileList 时别直接 push 或赋值
input.files 是只读的 FileList 对象,无法用 files.push() 或 files[0] = new File(...) 修改。想合并多次选择?得先转成数组:Array.from(input1.files).concat(Array.from(input2.files));想模拟预填充?只能用 DataTransfer 构造(Chrome/Edge 支持,Firefox/Safari 兼容性差)。更现实的做法是收集多个 File 对象后统一上传,而不是试图篡改 input.files。
立即学习“前端免费学习笔记(深入)”;
最常被忽略的一点:Safari 在 iOS 上至今不支持 webkitdirectory 和可靠的多文件拖放,哪怕你把 HTML、JS、后端全写对了,用户在 iPhone 上点一次“选取文件”还是只能选一个——这时候降级方案(比如多个单文件 input 并排,或引导用户用桌面端操作)不是可选项,而是必选项。



















