ThinkPHP上传失败主因是底层环境配置不当:先查php.ini中file_uploads=On、upload_max_filesize和post_max_size是否合理并重启服务;再确认目标目录存在、可写且属主匹配Web进程用户;最后验证表单enctype="multipart/form-data"及前端FormData键名一致。

ThinkPHP 文件上传失败,多数情况不是框架本身的问题,而是底层环境没配好。重点盯三块:php.ini 限制是否放开、目标目录有没有写权限、表单 enctype 是否正确。
先看 php.ini 关键配置有没有开
上传根本没进来,$_FILES 就是空的——这时不用查 ThinkPHP 代码,直接看 PHP 底层开关和大小限制:
- file_uploads = On:必须开启,关了就彻底禁用上传功能
- upload_max_filesize = 20M:设为你实际要传的最大单文件大小(比如视频要传 100MB,这里至少写 128M)
- post_max_size = 130M:必须 ≥ upload_max_filesize,还要预留一点给其他表单字段,否则 POST 数据体被截断,$_FILES 直接为空
- max_execution_time = 300:大文件上传耗时长,超时会导致中断,建议调高
改完一定要重启 php-fpm 或 Web 服务,并用 phpinfo() 确认生效路径和数值,别只改了错的 php.ini 文件。
再检查目标目录是否存在且可写
$_FILES 有数据但 $file->moveTo() 报 “Unable to move” 错误,90% 是目录问题:
立即学习“PHP免费学习笔记(深入)”;
- ThinkPHP 不会自动创建多级目录,比如你写
$file->move('uploads/images'),必须确保uploads/和uploads/images/都已存在 - 目录属主和权限要匹配 Web 进程用户(如
www-data、nginx或apache),执行:mkdir -p runtime/upload && chown -R www-data:www-data runtime/upload && chmod -R 755 runtime/upload - 如果用的是
config/filesystem.php中的 disk 配置(如 local 驱动),注意'root' => 'public/uploads'是相对于public_path()的,不是项目根目录
最后确认表单 enctype 和前端构造
前端没送进来,后端再怎么调都白搭:
- HTML 表单必须带
enctype="multipart/form-data",缺了这个,浏览器根本不会把文件编码进请求体 - 用 JS 上传时,
FormData.append('file', input.files[0])的 key(这里是'file')必须和后端接收名一致,比如 ThinkPHP 里用$this->request->file('file') - 多个文件上传别用相同 name 覆盖,要用
<input type="file" name="files[]" multiple>,然后在 PHP 侧遍历处理
不复杂但容易忽略



















