Z-Blog 附件上传失败:类型、大小、权限三重定位

· zblog · 阅读 7
摘要

先说结论:附件上传失败基本跑不出三类原因——文件类型被拦、大小超限、目录不可写。按这三层依次排查,比反复重试有效得多。 一、第一层:文件类型 站点设置里有允许上传的扩展名清单,不在清单里的直接拒。 注意扩展名大小写与双扩展名(如 .jpg

先说结论:附件上传失败基本跑不出三类原因——文件类型被拦、大小超限、目录不可写。按这三层依次排查,比反复重试有效得多。

一、第一层:文件类型

  • 站点设置里有允许上传的扩展名清单,不在清单里的直接拒。
  • 注意扩展名大小写与双扩展名(如 .jpg.php)会被安全策略拦。
  • 某些格式(svg、webp、avif)在老版本或严格配置下默认不允许,需要手动加。
  • 提示「文件类型不允许」时先看这一层,别怀疑网络。

二、第二层:文件大小

这里有三个限制同时生效,任何一层超了都会失败,且提示信息往往不明确:

  1. 站点设置里的上传大小上限。
  2. PHP 的 upload_max_filesize 与 post_max_size。
  3. Nginx 的 client_max_body_size(超限常返回 413)。

排查方法:先用一张几十 KB 的小图测试。小图能传、大图不能传 → 一定是大小限制;小图也传不了 → 继续看权限。

三、第三层:目录与权限

  • 上传目录必须可写,属主应与 PHP 运行用户一致。
  • 检查磁盘是否已满(这个最常见也最容易被忽略)。
  • 检查是否有安全软件/防火墙拦截了上传请求。
  • 临时目录(/tmp)不可写也会导致上传静默失败。

四、快速定位流程

  1. 看提示文案:明确说类型 → 第一层;说大小/413 → 第二层;无提示或 500 → 第三层。
  2. 开调试模式与错误日志,复现一次,直接看报错行。
  3. 用 curl 模拟上传,排除前端 JS 干扰。

五、加固建议

  • 上传目录禁止执行 PHP,这是防木马的关键一步。
  • 定期清理无主附件,避免占满磁盘。
  • 备份时别忘了附件目录,只备数据库等于没备。