浏览器文件夹上传需前端设webkitdirectory属性并禁用accept,后端须支持带斜杠的filename且中间件不拦截,Nginx等需调大header缓冲区。

浏览器能选中文件夹,但后端收不到任何文件或报 multipart request parse failed,基本是前后端没对齐——不是前端没发,而是后端压根没“认出”这是个文件夹上传请求。
input 元素必须带 webkitdirectory 且禁用 accept 过滤
很多人以为加了 multiple 就能传文件夹,其实不行。关键属性是 webkitdirectory,它会触发浏览器递归读取子目录,并给每个 File 对象注入 webkitRelativePath 字段。如果同时写了 accept=".dwg,.pdf",Chrome 和 Edge 会直接屏蔽整个文件夹(哪怕里面全是合法后缀),Firefox 则可能静默跳过不匹配的子项,导致后端看到的文件数远少于预期。
- 正确写法:
- 错误写法:
(删掉accept) - 注意:
directory是冗余属性,仅作语义提示,真正起作用的是webkitdirectory
后端收到的仍是普通 multipart,但文件名含斜杠需特殊处理
浏览器上传时并不会额外标记“这是文件夹”,它只是把每个文件按 webkitRelativePath 的值作为 filename 字段发过去,比如 设计图纸/液压系统/阀块.dwg。很多后端框架(如 Express + Multer、Spring Boot)默认会把带斜杠的文件名当作路径遍历风险拦截,直接丢弃或报错。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- Multer 用户:必须显式配置
preservePath: true,否则req.files[0].originalname会被截断成阀块.dwg - Spring Boot 用户:检查是否启用了
spring.servlet.multipart.resolve-lazily=true,并确认CommonsMultipartResolver或StandardServletMultipartResolver没做非法字符过滤 - 所有后端:打印原始
Content-Disposition头,确认filename="设计图纸/液压系统/阀块.dwg"是否完整到达服务器
服务端中间件或反向代理可能截断长 filename
当文件夹很深(比如 A/B/C/D/E/F/图纸.dwg)、文件名含中文或特殊字符时,Nginx 默认的 client_header_buffer_size(通常 1KB)和 large_client_header_buffers 可能不够,导致整个 multipart boundary 被切碎,解析器直接放弃——此时日志里往往只有模糊的 400 Bad Request 或空 req.files。
- 临时验证:用 curl 手动构造一个带长 filename 的 multipart 请求,绕过浏览器
- Nginx 必须调大:
client_header_buffer_size 4k;和large_client_header_buffers 4 8k; - Cloudflare 或 WAF 也可能静默丢弃含斜杠或 UTF-8 路径的 header,建议上传时先关闭测试
最常被忽略的一点:文件夹上传本质仍是批量单文件上传,它不改变 HTTP 协议层的任何规则。所谓“无法解析”,90% 是后端没意识到 filename 字段可以合法包含路径分隔符,或者中间某层安全策略把它当成了攻击特征。别急着换技术栈,先抓包看原始请求体里有没有你想要的 webkitRelativePath 值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










