upload_max_filesize过小导致上传为0字节,需同步调大post_max_size并重启服务;tmp目录权限或磁盘问题使move_uploaded_file失败;thinkphp验证规则语法错误(如size单位、ext大小写)或fileinfo未启用也会引发异常。

upload_max_filesize 被设太小,上传直接 0 字节
ThinkPHP 接收不到文件,$_FILES 为空或 size 为 0,大概率是 PHP 主配置拦下了。不是框架问题,是 PHP 还没把文件交给它。
-
upload_max_filesize必须 ≥ 你预期上传的文件大小(比如要传 10MB 视频,这里至少写10M) - 别忘了同步调大
post_max_size,它得 ≥upload_max_filesize,否则 POST 数据整体被截断 - 修改后必须重启 Web 服务(
php-fpm或 Apache),仅重载配置不生效 - 用
phpinfo()或ini_get('upload_max_filesize')确认实际生效值,别只看配置文件
tmp 目录不可写或磁盘满,move_uploaded_file 静静失败
ThinkPHP 显示“上传成功”,但目标路径没文件,或者日志里出现 move_uploaded_file(): Unable to move —— 文件卡在临时目录出不去了。
- 检查
sys_get_temp_dir()返回的路径(通常是/tmp或C:\Windows\Temp),确认 Web 进程用户(如www-data、nginx、IIS_IUSRS)有读写权限 - Linux 下常见坑:
/tmp挂载时加了noexec或nosuid,部分发行版还限制非 root 写入,可改upload_tmp_dir到项目内可写目录(如runtime/upload_tmp) - 磁盘空间和 inodes 都要查,
df -h和df -i一起看 - Windows 上注意杀毒软件可能锁定临时文件,临时禁用测试
ThinkPHP 的 validate 规则写错,报错信息却像服务器问题
上传表单提交后跳 500 或白屏,但错误日志里只有 InvalidArgumentException 或空数组,其实是验证规则语法错了,框架在解析时就崩了。
-
['size' => 2048]表示 2048 字节,不是 KB;要限制 2MB 得写['size' => 2097152]或用字符串'size:2097152' -
['ext' => 'jpg,png,gif']中扩展名必须小写,且不能带点(.jpg会匹配失败) - 如果用了
fileInfo验证(如'mimes:jpeg,png'),确保 PHP 编译时启用了fileinfo扩展,否则直接抛异常 - 调试时先注释掉
validate,确认基础上传通路,再逐条加回规则定位哪条触发崩溃
Linux 下 storage 目录权限不足,文件存进去了但无法访问
上传成功、文件也出现在 public/uploads/ 里,但浏览器访问返回 403 或 404 —— 不是 PHP 问题,是 Web 服务器拒绝提供静态文件服务。
- Apache 需确保
uploads目录有AllowOverride None+Require all granted(尤其在.htaccess生效时) - Nginx 要检查
location块是否覆盖了上传路径,常见漏配:location ^~ /uploads/ { add_header X-Debug "serving"; }后面缺try_files或alias - 目录权限:Web 用户需对
uploads有读+执行(rx),Linux 下chmod 755 uploads通常够用;若用 ACL 或 SELinux,ls -Z和getenforce得看一眼 - 上传后文件属主常是
www-data:www-data,但目录属主是部署用户,导致新文件权限继承异常,建议统一用chown -R www-data:www-data uploads
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











