Search code examples
phplaravelvalidationmultiple-file-upload

Multiple file upload validation in laravel


I have multiple input fields with multiple file upload for each field.

<?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 } ?>

I have got files in the request like this:

"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"
    ]
  ]

In this case, I have two input fields with 2/2 files. When I have tried to validate mime type for only images like this:

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

I have got following error:

FatalThrowableError in ReservationController.php line 67: Cannot use [] for reading

Can someone tell me what is wrong with the above code ? Suggestions are appreciated.


Solution

  • Try removing the blank $messages array and calling the function all() for the inputs on the request.

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

    To display the default error message you would throw an exception using something like:

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

    Then to display the errors you can have something like the following in your blade view or template:

    @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
    

    or

    @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