The image must be an image, Laravel validation error

Viewed 5449

I'm trying to upload an image on a form register, but when I submit this form, I receive this error "The image must be an image.". I already changed the model to accept all image extensions and tried to add "enctype="multipart/form-data" " on my form, but it didn't work.
How can I solve this problem? I need this image upload.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User;
use Illuminate\Foundation\Livros;

class Livro extends Model
{
    use HasFactory;
    
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'livro',
        'users_id',
        'namel',
        'autor',
        'editora',
        'categoria',
        'classificação',
        'descricao',
        'image'=>'required|image|mimes:jpeg,jpg,png,bmp,gif,svg',

    ];

}

Controller

protected function validator(Request $request)
{
        return Validator::make($request, [
            'namel' => ['required', 'string', 'max:200'],
            'autor' => ['required', 'string', 'email', 'max:200'],
            'editora' => ['required', 'string', 'max:50'],
            'categoria'=> ['required', 'string', 'min:50'],
            'classificação'=> ['required', 'string', 'min:1','max:2'],
            'descricao'=> ['required', 'string', 'min:200'],
            'image'=> ['required'],
  
        ]);
    }

     /**
      * Store a newly created resource in storage.
      *
      * @param  \Illuminate\Http\Request  $request
      * @return \Illuminate\Http\Response
      */
    public function create(StoreUpdateLivro $request)
    {
        
        $user = Auth::user()->id;
        $data = $request->all();

        if($request->file('image')->isValid()){

           $image = $request->image->store('livros');
           $data['image'] = $image;
        }

        
        Livro::create([
            'users_id' => $user,
            'namel' => $request['namel'],
            'autor' => $request['autor'],
            'editora' => $request['editora'],
            'categoria'=> $request['categoria'],
            'classificação'=>$request['classificação'] ,
            'descricao'=>$request['descricao'],
            'image'=>$request['image'],
        ]);
        return view('livros/cadastro');

        
    }

Blade

<form method="POST" enctype=”multipart/form-data” action="{{ url('/cadastro_livros') }}">
       <div class="form-group row">
                                <label for="image" class="col-md-4 col-form-label text-md-right">{{ __('CAPA') }}</label>
                                
                                <div class="col-md-6">
                                    <input type="file" class="form-control @error('image') is-invalid @enderror" name="image"  >
    
                                    @error('image')
                                        <span class="invalid-feedback" role="alert">
                                            <strong>{{ $message }}</strong>
                                        </span>
                                    @enderror
    
                                    <br>
                                </div>
                            </div>
</form>
2 Answers

Your enctype=”multipart/form-data” is not correctly set, it is using strange " (dobule quotes), see they are like ” instead of ", so maybe you do not have enctype set, hence no file is being sent...

This is how the problem got solved for me!

  1. Make Sure you have added

    enctype="multipart/form-data"

  2. Input Type should be file

    <input type="file" name="image">

then In the validation

'image' => 'file|mimes:jpg,jpeg,png,gif|max:1024',

Related