Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

Posted

技术标签:

【中文标题】Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证【英文标题】:Laravel image rule validation is not working for Laravel 8 but was working for Laravel 7 | Laravel | Image | Validation 【发布时间】:2021-07-19 16:30:56 【问题描述】:

我正在开发一个版本为 7.30.4 的 Laravel 应用程序。该项目运行良好。但是最近我将 Laravel 版本更新到了 8.0.0 版本。该应用程序也可以正常工作。但是image validation rule 不再工作了。

这是我的规则

$rules = [
    'logo' => 'nullable|image|mimes:jpeg,bmp,png,jpg'
];

当我尝试上传图片时,它总是给出验证错误

'标志必须是图像。'。

但在 Laravel 7 中,我从未遇到过使用同一个文件的问题。

在我的生产服务器上,该项目在 Laravel 7.30.4 上运行。恐怕如果我在生产中更新版本,那么图像验证将不再有效。

问题是,为什么图像验证的行为不适用于以前版本的 Laravel 8.0 版本。

更新:-

我还检查了 jpg/jpeg 图像的问题。 PNG 文件工作正常,但在 jpg/jpeg 图像的情况下,它总是会出现上述验证错误。 当我尝试上传 BMP 文件时出现错误 "不支持的图像类型。GD 驱动程序只能解码 JPG、PNG、 GIF 或 WebP 文件。”

【问题讨论】:

可能是您上传的图片太大,无法作为图片到达 laravel?或者你上传的图片不是真正的图片(即使扩展是正确的) @N69S 否。相同的图像正在上传到生产服务器或其他 Laravel 版本为 7.30 的机器上工作正常。 这是一个错误并已修复 github.com/laravel/framework/issues/35417 Thanx @EsTeAa 我也调查过。但是除了升级 Laravel 版本之外,添加“jpg”的最佳方法是什么? 【参考方案1】:

我调查并检查, 在 Laravel 版本(v8.17.0 之前)的图像验证规则中,他们没有为 mimes 列表数组添加 'jpg'。这就是为什么我无法上传 jpg 文件的原因。然而,“jpg”出现在 Laravel 版本 7 的 mimes 列表中。

https://github.com/laravel/framework/blob/v8.17.0/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1030

/**
 * Validate the MIME type of a file is an image MIME type.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function validateImage($attribute, $value)

    return $this->validateMimes($attribute, $value, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp']);

https://github.com/laravel/framework/blob/v8.16.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L1030

/**
 * Validate the MIME type of a file is an image MIME type.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function validateImage($attribute, $value)

    return $this->validateMimes($attribute, $value, ['jpeg', 'png', 'gif', 'bmp', 'svg', 'webp']);

所以解决办法就是将Laravel版本升级到至少v8.17.0。

或者有人可以告诉我更新现有列表的更好方法,因为当我尝试升级 Laravel 版本时,也会出现一些兼容问题,而且我们不应该更改供应商文件夹中的内容,因为在下一个作曲家更新它会覆盖或清除更改?

【讨论】:

我会创建一个自定义规则并从 v7 的框架中复制代码并使用自定义规则来验证 mime 类型

以上是关于Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 表单请求验证规则“必需”不适用于空值

正则表达式验证规则,以避免特殊字符不适用于 laravel 中的文本字段

Laravel 请求验证不适用于邮递员请求

Laravel表单请求验证不适用于getValidatorInstance()

Larave中CSRF攻击

文本区域验证最大规则在 laravel 6 中不起作用