【问题标题】:Laravel Validate Array of Files Total Allowable Upload SizeLaravel 验证文件数组总允许上传大小
【发布时间】:2018-04-13 17:50:02
【问题描述】:

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

<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 的总上传大小,验证不起作用。我是否必须编写自定义验证规则来验证上传文件的总大小限制。或者是否有任何预定义的验证规则?任何帮助表示赞赏。

谢谢!

【问题讨论】:

    标签: php laravel validation file-upload filesize


    【解决方案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; 
    
        });
    
    }
    

    【讨论】:

    • 非常感谢,我之前一直在寻找类似的东西,但从未找到这种方法。想知道为什么官方验证文档中没有提到 h*ck ???
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2011-06-24
      • 1970-01-01
      • 2011-04-12
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多