Isabela Navarro
Isabela Navarro

Reputation: 71

The image must be an image, Laravel validation error

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>

Upvotes: 2

Views: 24659

Answers (2)

A.K.S
A.K.S

Reputation: 117

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',

Upvotes: 6

matiaslauriti
matiaslauriti

Reputation: 8082

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...

Upvotes: 18

Related Questions