TP5.1与TP6的request()->file()行为差异显著:TP5.1返回think\File实例且兼容性好,TP6返回门面封装、增强校验、严格报错、目录创建需手动或改用store、验证需rule绑定、Upload类已移除、临时文件需手动清理。

ThinkPHP 5.1 的 request()->file() 和 TP6 的 request()->file() 行为不一致
TP5.1 中 request()->file() 返回的是 think\File 实例,而 TP6 默认返回 think\facade\File(实际是 think\File 的门面封装),但关键差异在底层:TP6 引入了更严格的 MIME 类型校验和临时文件生命周期管理。上传失败时,TP5.1 可能静默返回 null,TP6 则更倾向抛出 think\exception\FileException。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- TP5.1 中判断上传是否成功,优先用
if ($file && $file->isValid());TP6 必须加try/catch捕获FileException,否则未校验的空文件或超限会直接报错 - TP6 的
$file->getOriginalName()在 IE 上传时可能含完整路径(如C:\fakepath\abc.jpg),需手动截取文件名;TP5.1 内部已做兼容处理 - TP6 默认启用
isImage()的严格校验(读取文件头),若上传带 EXIF 的 PNG 可能误判,可临时关闭:$file->checkIsImage(false)
TP5.1 升级到 TP6 后 moveTo() 报 Directory not writable
不是权限问题,而是 TP6 的 moveTo() 默认使用 think\File 自带的写入逻辑,会先尝试创建目录,但默认只递归创建一级子目录;而 TP5.1 依赖 PHP 原生 move_uploaded_file(),对目标路径父目录是否存在不敏感。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确保目标路径父目录存在且可写,例如上传到
public/uploads/2024/06/,需提前创建public/uploads,TP6 不会自动创建多级 - 改用
$file->store('uploads')或$file->storeAs('uploads', 'xxx.jpg')—— 这两个方法内部会自动递归创建目录,且兼容 TP5.1 的配置习惯 - 若坚持用
moveTo(),先调用mkdir($dir, 0755, true)手动创建完整路径
TP6 中 validate(['size'=>1024000, 'ext'=>'jpg,png,gif']) 不生效
TP6 的验证规则必须通过 rule 方法显式绑定,不能像 TP5.1 那样直接传数组给 validate()。传数组会被忽略,且无任何提示。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 正确写法:
$file->validate(['size'=>1024000, 'ext'=>'jpg,png,gif'])->move($path) - 注意:TP6 的
size单位是字节,TP5.1 支持'size'=> '1024kb'这类字符串写法,TP6 不支持,必须传整数 - 扩展名校验区分大小写:TP6 默认校验
jpg但不认JPG,需显式转小写或加'ext'=>'jpg,png,gif,JPG,PNG,GIF'
TP5.1 的 Upload 类(think\Upload)在 TP6 中彻底移除
TP6 不再提供独立的 Upload 类,所有上传逻辑收归 think\File 和 think\facade\File。试图 use think\Upload 会触发类未找到错误。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 删除所有
new Upload()实例化代码,改用request()->file('name')获取文件对象 - 原
Upload类的批量上传、多字段映射等逻辑,需自行封装:遍历$_FILES或用request()->file()多次调用 - TP6 的
store()方法默认按日期生成子目录(如20240612/xxx.jpg),若需关闭,传第三个参数false:$file->store('uploads', '', false)
最易被忽略的是 TP6 对临时文件销毁时机的控制——moveTo() 成功后,原临时文件不会自动删除,若后续逻辑异常退出,可能残留临时文件;而 TP5.1 的 Upload 类在实例销毁时会清理。需要自己确保异常路径下也调用 $file->close() 或手动 unlink 临时文件。



















