You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
        ]
    ];
}

关键说明

  1. 直接使用$value参数:Laravel会自动将上传的文件实例传入passes方法的$value,无需重复从Request获取
  2. 文件有效性验证:确保上传的是有效文件,避免后续宽高获取报错
  3. 错误信息处理:通过message方法返回错误提示,Laravel会自动将其加入错误集合,在视图中可通过$errors->first('picture')获取
  4. 横向判断逻辑:若需要严格的横向(宽度必须大于高度),可将$width >= $height改为$width > $height

内容的提问来源于stack exchange,提问作者dzonkile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:45:35