ThinkPHP 6.0 文件上传核心三步:前端设 enctype="multipart/form-data" 并匹配 name 名;控制器用 Filesystem::disk('public')->validate()->putFile() 安全保存;上传后需执行 php think storage:link 建软链接方可通过 /storage/ 路径访问。

ThinkPHP 6.0 实现简单文件上传,核心就三步:前端表单正确提交、控制器接收并验证、文件安全保存到可访问目录。不依赖复杂配置,用框架内置能力就能快速跑通。
前端表单必须设对编码类型
表单 enctype="multipart/form-data" 是硬性要求,缺了这句,$_FILES 就是空的,后端无论如何都拿不到文件。
同时确保 input type="file" 的 name 属性和后端读取的字段名一致,比如:
- 前端写:
- 后端就要用:
request()->file('avatar')
如果用 Ajax 提交,别发 JSON,要用 FormData 并让浏览器自动设置 Content-Type,否则也会失败。
控制器里用 validate + putFile 一步到位
推荐使用 Filesystem::disk('public')->putFile(),它自动重命名、自动分目录、自带基础校验,比手动 move() 更简洁安全。
示例代码(放在控制器方法中):
$file = request()->file('avatar');$path = \think\facade\Filesystem::disk('public')<br> ->validate(['size' => 2048000, 'ext' => 'jpg,png,gif,jpeg'])<br> ->putFile('avatars', $file);
上传成功后返回类似 avatars/20261029/xxx.jpg 的路径,注意这只是相对路径,不是完整 URL。
让文件能被网页直接访问
上传后的文件默认存在 public/storage/ 下,但不能直接通过 /storage/xxx.jpg 访问,需要先运行命令建立软链接:
- 终端执行:
php think storage:link - 执行后,就可以用
/storage/avatars/xxx.jpg在浏览器打开图片了
如果不想用软链接,也可以把文件直接存到 public/uploads/ 这类公开目录,再手动拼 URL,比如 /uploads/xxx.jpg,但要注意提前创建目录并赋予写权限。
常见报错怎么快速定位
上传失败时,先看是不是根本没收到文件:
- 在控制器开头加
dump($_FILES); exit;,确认原始数据是否存在 - 检查
php.ini:确保file_uploads = On,且upload_max_filesize和post_max_size足够大(如都设为10M) - Nginx 用户还要确认
client_max_body_size设置匹配
如果 $_FILES 有数据但验证失败,错误信息会由 ValidateException 抛出,catch 住就能提示用户具体原因。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











