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

问题描述 投票:0回答:3

我的视图有一系列文件输入,例如

<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
3个回答
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; 

    });

}

0
投票

这不是一个非常优雅的解决方案,但是,我会 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

0
投票

已按如下方式解决,这可能不是应该这样做的方式。

控制器接收协议(必需)和(可能)其他文件的扫描,称为 otra。

下面的代码创建了一个新变量 $totalsize,其中添加了各个文件的大小。该变量除以 1000 以从字节转换为 kb 并四舍五入并转换为整数以进行验证(无法验证 double 类型变量)。

随后将该变量插入到验证请求中,并根据最大 2048kb 进行验证。

 public function submit(Request $request)
{
    $totalsize = $request->agreement->getsize();
    if ($request->file('otra')) {
        foreach ($request->file('otra') as $file) {
            $totalsize = $totalsize + $file->getsize();
        }
    }
    $totalsize = (int) round($totalsize / 1000);

    $request->request->add(['totalsize' => $totalsize]);  // add to request

    $validator = Validator::make($request->all(), [
        'email'            => ['required', 'email'],
        'agreement' => ['required', 'mimes:pdf'],
        'name'             => ['required'],
        'otra.*'           => ['mimes:jpg,jpeg,png,pdf'],
        'totalsize'        => ['integer', 'max:2048']
    ]);
© www.soinside.com 2019 - 2024. All rights reserved.