使用 Laravel 验证上传的图像或视频
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
相关文章