Laravel中如何验证提交的图片是否为横向?
解决Laravel横向图片验证的正确实现
问题分析
你的现有代码存在几个关键问题:
- 无需重复从Request中获取
picture,passes方法的$value参数就是上传的文件实例 - 获取图片宽高需用方法(
->width()/->height())或getimagesize函数,而非直接访问属性 - 不要在规则类中手动调用
session()->flash,Laravel验证系统会自动处理错误信息 - 缺少对文件有效性、是否为图片的前置验证
修正后的自定义规则类(Horizontal.php)
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Illuminate\Http\UploadedFile; class Horizontal implements Rule { public function passes($attribute, $value) { // 验证上传的是有效图片文件 if (!$value instanceof UploadedFile || !$value->isValid()) { return false; } // 获取图片宽高(两种方式任选其一) // 方式1:使用Laravel UploadedFile的内置方法 $width = $value->width(); $height = $value->height(); // 方式2:使用PHP原生函数 // [$width, $height] = getimagesize($value->getPathname()); // 判断是否为横向(宽度 >= 高度,若要求严格横向可改为$width > $height) return $width >= $height; } public function message() { return '图片必须为横向(宽度不小于高度)'; } }
修正后的Request验证规则
在Request类的rules方法中,添加图片类型的前置验证,提前过滤非图片文件:
public function rules() { return [ 'title' => 'required|min:2|max:255', 'body' => 'required|min:10', 'picture' => [ 'required', 'image', // 验证是图片格式 'mimes:jpeg,png,gif', // 限制允许的图片类型 new Horizontal() ] ]; }
关键说明
- 直接使用$value参数:Laravel会自动将上传的文件实例传入
passes方法的$value,无需重复从Request获取 - 文件有效性验证:确保上传的是有效文件,避免后续宽高获取报错
- 错误信息处理:通过
message方法返回错误提示,Laravel会自动将其加入错误集合,在视图中可通过$errors->first('picture')获取 - 横向判断逻辑:若需要严格的横向(宽度必须大于高度),可将
$width >= $height改为$width > $height
内容的提问来源于stack exchange,提问作者dzonkile
相关产品推荐
相关产品推荐

