ThinkPHP 5.1 文件上传验证失效主因是验证器类型错误、表单编码缺失、字段名不匹配或未处理多文件结构;须改用 FileValidate 类、确保 enctype="multipart/form-data"、严格按 size/ext/tmp_name 键名传参,并对多文件手动展开为单文件数组。

一、用了普通 Validate,但没用 FileValidate 类
validate(['file' => 'require|fileSize:2097152']) 这种写法在 TP5.1 中注定无效:普通 think\Validate 不识别 fileSize、fileExt 等文件专属规则。
- 必须改用专为上传设计的 think\FileValidate 类
- 传入的数据必须是
$_FILES['xxx']原生数组(含tmp_name、size、extension等字段) - rule() 中键名只能是
size、ext、tmp_name——不能写成file.size或avatar.size
正确示例:
use think\FileValidate;
$data = $_FILES['avatar'];
$validate = new FileValidate();
$result = $validate->rule([
'size' => 'require|between:0,2097152',
'ext' => 'in:jpg,png,gif'
])->check($data);
二、HTML 表单缺 enctype,请求根本没带文件
如果 var_dump($_FILES) 输出空数组,验证连第一步都进不去。
- 检查 form 标签是否写了
enctype="multipart/form-data" - 前端 JS 用 FormData 上传时,
append('cover', file)的 key 名必须和后端$_FILES['cover']一致 - 确保 PHP 配置中
file_uploads = On,且upload_max_filesize和post_max_size足够大
三、规则字段名与 $_FILES 结构不匹配
FileValidate 只认原始 $_FILES 数组的固定键名:size、ext、tmp_name、error。
立即学习“PHP免费学习笔记(深入)”;
- 不要试图传一个自定义数组如
['file_size'=>1024]—— 它会直接跳过校验 -
ext规则值必须小写、无点、逗号分隔,例如'jpg,png';写成'JPG,PNG'或'.jpg'都不生效 -
size单位是字节,1MB 要写1048576,不能写1024*1024(TP 不解析表达式)
四、多文件场景未做数据预处理
当表单是 <input type="file" name="images[]" multiple> 时,$_FILES['images'] 是二维结构,FileValidate 无法直接处理。
- 必须先手动展开成标准单文件数组列表:
$files = $_FILES['images'];
$items = [];
foreach (array_keys($files['name']) as $i) {
$items[] = [
'name' => $files['name'][$i],
'tmp_name' => $files['tmp_name'][$i],
'size' => $files['size'][$i],
'extension' => $files['extension'][$i],
];
}
// 再逐个用 FileValidate 校验 $items[$i]



















