使用 Laravel 验证上传的图像或视频

2023-06-01 图像 验证 上传

Laravel 的 Validator 使使用“图像”规则将请求的文件字段验证为图像变得简单,您可以通过限制 MIME 类型来组合验证视频的规则。

$request->validate([
   'image_upload' => 'image|max:1024',
   'video_upload' => 'mimetypes:video/avi,video/mpeg,video/quicktime|max:102400']);


但是,

如果您有一个上传字段应该接受最多 10 兆字节的视频,或者接受不超过 1 兆字节的图像,

会发生什么情况?

这对于 Laravel 的 Validator 来说更加棘手:

使用 Laravel 的内置验证规则似乎没有一个优雅的解决方案。


幸运的是,

Laravel 允许我们创建自己的自定义验证规则。

我们可以创建一个自定义规则闭包来检查上传的是图像还是视频,然后根据上传类型验证规则。

$request->validate([
   'file', // Confirm the upload is a file before checking its type.
   function ($attribute, $value, $fail) {
       $is_image = Validator::make(
           ['upload' => $value],
           ['upload' => 'image']
       )->passes();

       $is_video = Validator::make(
           ['upload' => $value],
           ['upload' => 'mimetypes:video/avi,video/mpeg,video/quicktime']
       )->passes();

       if (!$is_video && !$is_image) {
           $fail(':attribute must be image or video.');
       }

       if ($is_video) {
           $validator = Validator::make(
               ['video' => $value],
               ['video' => "max:102400"]
           );
           if ($validator->fails()) {
               $fail(":attribute must be 10 megabytes or less.");
           }
       }

       if ($is_image) {
           $validator = Validator::make(
               ['image' => $value],
               ['image' => "max:1024"]
           );
           if ($validator->fails()) {
               $fail(":attribute must be one megabyte or less.");
           }
       }
   }]);


我会第一个承认:这段代码看起来很不雅观。

但它有效,并且闭包利用了现有的验证器规则,如“图像”和“最大”。


如果您更喜欢面向对象的方法,则可以将此代码提取到自定义规则对象,并且可能提取 is_video() 和 is_image() 的方法。

您甚至可以在 Rule 对象的构造函数中配置最大上传大小


如果您在自己的项目中遇到这个特殊挑战,希望这篇文章可以为您节省一些时间。

另外,如果您知道更优雅的实现方式,请发表评论!


转:

https://dev.to/tylerlwsmith/validating-an-upload-as-an-image-or-a-video-with-laravel-2k5l


相关文章