multiple属性仅支持多文件选择,不支持文件夹上传;因其设计目标是扩展文件对话框的多选能力,而非触发文件夹选择,且标准input无法读取目录结构,需用webkitdirectory或showDirectoryPicker等替代方案。

multiple 属性不支持选择文件夹,只支持选择文件。
为什么不能用 multiple 选文件夹?
浏览器原生 <input type="file"> 的 multiple 属性设计目标是多文件选择,不是多目录。它根本无法触发“选择文件夹”对话框——哪怕加了 webkitdirectory 或 directory,那也和 multiple 无关,且行为完全不同。
常见误判:用户以为按住 Ctrl/Cmd 多选几个文件夹就能上传整个目录结构,结果发现 e.target.files 里只有空数组或报错,因为绝大多数浏览器(Chrome/Firefox/Edge 桌面版除外)根本不允许通过标准 file input 读取文件夹内容。
-
webkitdirectory是非标准属性,仅 Chrome/Edge 支持,且会禁用multiple(选一个文件夹,不是多个) -
directory是草案属性,Safari 完全不支持,Firefox 已弃用 - iOS Safari 和大部分 Android 浏览器连单个文件夹都不认,直接忽略这些属性
想上传整个文件夹?得换方案
真要上传文件夹及其子结构,必须绕过 <input type="file">,改用拖拽 + webkitGetAsEntry() 或现代 showDirectoryPicker() API。
立即学习“前端免费学习笔记(深入)”;
-
showDirectoryPicker()是当前唯一规范方案,但仅 Chromium 95+ 和 Edge 95+ 支持,Firefox 和 Safari 尚未实现 - 拖拽文件夹时,需遍历
event.dataTransfer.items,对每个item.webkitGetAsEntry()判断是否为DirectoryEntry,再递归读取 - 递归读取有深度限制和性能风险,大目录容易卡死 UI;需手动控制并发、设 timeout、跳过符号链接
- 后端接收时,路径信息不会自动保留——你得在 FormData 中显式 append 路径字段,比如
formData.append('path', 'sub/folder/photo.jpg')
multiple 属性能做什么?明确边界
它只做一件事:让用户在文件选择对话框中一次勾选多个独立文件(非文件夹),然后让 e.target.files 返回长度 >1 的 FileList。
- 正确写法:
<input type="file" multiple>—— 不加值,不配其他类型,不和capture共存(否则可能退化为单图拍摄) - 用户操作:Windows 按 Ctrl + 点击,macOS 按 Cmd + 点击,或鼠标框选,或直接拖拽多个文件到 input 区域(桌面浏览器)
- JS 读取必须用
input.files,不是input.value;files是只读FileList,要遍历得先Array.from(files) - 上传多个文件时,
FormData.append('files', file)要调用多次(同 key),后端才能收到数组;别写成append('files[]', file),PHP 风格的方括号后端不认
真正麻烦的从来不是怎么写 multiple,而是以为它能解决文件夹问题——一旦走错方向,后面所有 JS 逻辑和后端接收都会白忙。



















