Laravel 的 dimensions 规则可直接校验图片宽高、比例及尺寸范围,需配合 file 和 mimes 使用;精确尺寸用 width=×height=;WebP 或透明 PNG 可能因 GD 限制报错;自定义错误提示需修改语言包;前端预览不能替代后端验证。

validate() 里用 dimensions 规则就行
不需要写自定义验证器,Laravel 自带的 dimensions 规则能直接校验宽高、比例、最小/最大尺寸。它只对图像文件生效(jpeg、png、gif、webp),非图片会跳过该规则(但建议前置加 mimes:jpeg,png,gif,webp 拦住非图)。
常见写法:
request()->validate([
'avatar' => 'required|file|mimes:jpeg,png,gif,webp|dimensions:min_width=100,min_height=100,max_width=500,max_height=500'
]);
注意:dimensions 必须和 file 及图像 MIME 类型约束一起用,否则对普通上传字段无效。
宽高必须精确匹配时用 width 和 height
如果业务要求「必须是 200×200 像素」,不能只靠 min_width/max_width,得用 width=200 + height=200 组合:
'icon' => 'required|file|mimes:png|dimensions:width=200,height=200'
容易踩的坑:
-
dimensions:width=200单独写没用,必须配height或其他尺寸参数,否则规则不触发 - WebP 图片在旧版 GD 库(如 PHP 7.4 默认)中可能读不出尺寸,报
Unable to get image dimensions错误 —— 换 Imagick 驱动或升级 PHP - 用户上传的 PNG 若含透明通道,GD 有时会误判尺寸,建议开发期用真实文件测试,别只信本地截图
验证失败时的错误信息不直观?改 resources/lang/en/validation.php
默认报错是 “The :attribute dimensions are invalid.”,用户根本不知道哪里错了。直接改语言包里的 dimensions 条目:
'dimensions' => '图片尺寸不符合要求:需为 :max_width × :max_height 像素以内,且至少 :min_width × :min_height。',
支持的占位符有::max_width、:max_height、:min_width、:min_height、:width、:height、:ratio(当用了 ratio 参数时)。别漏掉冒号。
如果项目多语言,对应改 zh-CN/validation.php 即可,不用动代码逻辑。
前端预览尺寸但后端仍要验证?别信 client-side
JS 用 FileReader + Image 对象能读取宽高,但仅作友好提示。绕过前端、直接 POST 二进制数据或改请求体,dimensions 规则照常拦截。所以:
- 前端检查只是体验优化,不能替代后端验证
- 不要在 JS 里用 canvas 重绘压缩后再上传——这会改变原始尺寸,导致后端
dimensions校验的是新图,和用户预期不符 - 如果业务真需要“上传即压缩”,应在后端用
Intervention Image处理,再存压缩后版本,原始验证仍走dimensions规则
真正麻烦的是用户上传了 8K 图但只要缩略图 —— 这时 dimensions 不是来限制上传,而是防止误传错规格资源,别让它背锅做缩放的事。


















