Laravel中的多文件上传验证

3

我有多个输入字段,每个字段都有多个文件上传。

<?php for ($i = 0; $i < $total; $i++)
   {
?>
<div class="col-md-3 addedClass">
     <label>Vehicle Images</label>
     <input type="file" name="vehicle_image[{{$i}}][]" multiple="multiple">
     @if($errors->has('vehicle_image'))
          <span class="help-block">
              <strong>{{$errors->first('vehicle_image')}}</strong>
          </span>
     @endif
</div>
<?php } ?>

我在请求中得到了这样的文件:

"vehicle_image" => array:2 [▼
    0 => array:2 [▼
      0 => "citizenship.jpg"
      1 => "logo_vehicle.png"
    ]
    1 => array:2 [▼
      0 => "ae backend.jpg"
      1 => "logo_vehicle.png"
    ]
  ]

在这种情况下,我有两个带有2/2文件的输入字段。当我尝试验证仅图片的mime类型时,代码如下:

$this->validate($request,[
           'vehicle_image' => 'mimes:jpeg,png,bmp,tiff |max:4096'
       ],$messages[
            // error messages 
      ]);

我遇到了以下错误:

ReservationController.php中第67行出现FatalThrowableError: Cannot use [] for reading的报错。

有没有人能告诉我上面的代码有什么问题?欢迎提出建议。


如果您删除空的$messages数组,会发生什么? - jeremykenedy
$this->validate($request, ['vehicle_image' => 'mimes:mimes:jpeg,png,bmp,tiff|max:4096']); - jeremykenedy
我在我的代码中没有这个。这是在提问时出现的错误。 - Sagar Gautam
2个回答

3
尝试删除空的 $messages 数组并对请求中的输入调用函数 all()
$rules = [
    'vehicle_image' => 'mimes:jpeg,png,bmp,tiff |max:4096'
];
$this->validate($request,$rules);

要显示默认错误消息,您可以使用类似以下代码的异常抛出方式:

throw new Exception("Error message");

    if ($validator->fails()) {
        $this->throwValidationException(
            $request, $validator
        );
        return redirect('VIEWPATH.VIEWNAME')->withErrors($validator)->withInput();
    }

然后,要显示错误信息,您可以在Blade视图或模板中添加以下内容:

@if (count($errors) > 0)
  <div class="alert alert-danger alert-dismissable fade in">
    <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
    <h4>
      <i class="icon fa fa-warning fa-fw" aria-hidden="true"></i>
      <strong>Error!</strong> See error messages...
    </h4>
    <ul>
      @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
      @endforeach
    </ul>
  </div>
@endif

或者

@if(session()->has('errors'))
    <div class="alert alert-danger fade in">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
        <h4>Following errors occurred:</h4>
        <ul>
            @foreach($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

让我试一下这个。 - Sagar Gautam
只是好奇,这里的空数组是有意为之吗? vehicle_image [{{$i}}] [] - jeremykenedy
在这种情况下,您可能需要使用自定义规则进行验证,该规则通过循环遍历输入数组并对其进行验证。 - jeremykenedy
看一下这篇文章:https://ericlbarnes.com/2015/04/04/laravel-array-validation/ 的“添加自定义验证规则”一节。 - jeremykenedy
1
同样的概念,使用另一个循环。 - jeremykenedy
显示剩余4条评论

0

只需从输入字段中删除额外的空数组索引。

<input type="file" name="vehicle_image[{{$i}}]" multiple="multiple">



$this->validate($request, [
            'vehicle_image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:4096'
        ]);

并且 dd($errors) 查看结果


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