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

时间:2017-11-01 12:04:23

标签: php laravel validation file-upload filesize

我的视图有一组文件输入,如

<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 个答案:

答案 0 :(得分:1)

不是一个非常优雅的解决方案但是,我会预先录制视频并使用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

答案 1 :(得分:1)

有必要添加自定义规则来验证总大小:

在你的控制器中:

$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; 

    });

}