Laravel验证文件数组总允许上传大小

9

我的视图中有一个文件输入的数组,如下所示:

<input type="file" name="videos[]" />
<input type="file" name="videos[]" />
...
...

我希望您能够校验总允许上传大小(例如:总允许上传限制为3Mb)。我已经编写了如下的验证代码:

$validatedData = $request->validate([
     'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);

但是这个验证每个视频的大小为3Mb。

我已经尝试过了。

$validatedData = $request->validate([
    'videos' => 'file|max:3000',
    'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);

/*------------------------------------------------*/

$validatedData = $request->validate([
    'videos' => 'array|max:3000',
    'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg|max:3000',
]);

但是,如果上传的总文件大小超过3MB,则验证将无法工作。我是否需要编写自定义验证规则来验证上传文件的总大小限制?还是有预定义的验证规则可用?感谢您的帮助。谢谢!
2个回答

15

我认为验证总大小的最佳方法是添加自定义验证规则,以下是实现方式:

在您的控制器中:

$validatedData = $request->validate([
    'videos' => 'array|max_uploaded_file_size:3000',
    'videos.*' => 'present|file|mimetypes:video/mp4,video/ogg',
]);

在AppServiceProvider.php中注册自定义验证

public function boot() {

    Validator::extend('max_uploaded_file_size', function ($attribute, $value, $parameters, $validator) {
        
        $total_size = array_reduce($value, function ( $sum, $item ) { 
            // each item is UploadedFile Object
            $sum += filesize($item->path()); 
            return $sum;
        });

        // $parameters[0] in kilobytes
        return $total_size < $parameters[0] * 1024; 

    });

}

2
非常感谢您,我之前一直在寻找类似的方法,但从未找到过。不知道为什么官方验证文档中没有提到这个方法?! - Daniel Malmgren

0

这不是一个非常优雅的解决方案,但我会使用foreach函数遍历视频,并使用php filesize函数(返回以字节为单位的整数大小)

3mb = 3,145,728,000字节

foreach($request['videos'] as $video){
$size = filesize($video);
if($size > 3145728000)
return Redirect::back()->withErrors(['msg', 'The Message']);

在您的视图中调用此代码。
@if($errors->any())
<h4>{{$errors->first()}}</h4>
@endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接