文件上传总是失败,提示类型不允许,是哪里限制的?

最后更新时间:2026-09-22 18:54:17

1. 结论:走的是白名单,不在名单里一律拒绝

VVCMS 的上传校验是 fail-closed 的:只有扩展名命中白名单才放行,不在名单里直接拒绝。这与"黑名单拦几个危险类型、其他都放行"的做法相反,安全性更高,但表现上更严格。

默认允许的类型:

分类扩展名
图片jpg jpeg png gif webp bmp ico
文档pdf doc docx xls xlsx ppt pptx txt md csv json xml
压缩包zip rar 7z gz tar
音视频mp3 wav mp4 webm

另外有一份危险扩展名硬黑名单(可执行、脚本类),即使被写进白名单也会被拒绝,无法通过配置放开。

2. 扩展名是怎么取的

系统取的是「文件名中第一个点之后的连续字母数字段」,不是简单的 filepath.Ext。这样处理是为了防一类绕过:

evil.jsp;.jpg

这种名字用常规方法会被判成 .jpg,但实际可执行部分藏在前面。当前写法会把它判成 jsp 并拒绝。

3. 常见失败原因,按顺序排查

  1. 扩展名不在白名单内。最常见。先确认你的文件后缀在上表里。
  2. 改了扩展名伪装。把 .php 改成 .png 也不行——系统会结合 MIME 类型做归类校验。
  3. 上传接口没带对字段名。外部 API 的 multipart 上传,文件字段名必须是 file,写错会直接返回文件解析错误。
  4. MCP 上传超大小。MCP 因为参数是 JSON,走 Base64:单个请求体上限 32 MB,解码后的文件上限 20 MB。
  5. 文件名本身非法。MCP 的 filename 必须带扩展名,且不能包含 /\..

4. 上传成功但结果和预期不一致

这几种情况不是故障

  • 图片变成了 WebP。是否转换由全局上传配置决定,可以在配置里调整。
  • 返回了一个已有的文件路径。系统按 SHA-256 去重,相同内容直接复用已有文件,不会重复占用存储。
  • 文件被归到了某个日期目录。文件按 MIME 类型和扩展名归类存放,路径里带日期是正常的。

5. 能不能放开某个类型

白名单是单一来源管理的:外部 API、后台上传、MCP 的 upload_file 都从同一处派生,改一处即可全局生效,不会出现"API 能传、MCP 传不了"的割裂。

放开的唯一例外是危险扩展名黑名单,那部分不提供配置开关。