Bonjour,

Voila je rencontre un petit problème avec mon code. Je suis la formation Laravel 5 et je veux réussir à la faire en Laravel 6.
Je rencontre pas mal de soucis dans la gestion des mages.

Ce que je fais

Mon controller:

<?php

namespace App\Http\Controllers;

use App\Post;
use Illuminate\Contracts\Auth\Guard;
use App\Http\Requests\UpdatePostRequest;

class PostsController extends Controller
{

    public function __construct(Guard $auth){
        $this->middleware('auth');
    }

    public function create(){
        $post = new Post;
        return view('posts.create', compact('post'));
    }

    public function store(UpdatePostRequest $request, Guard $auth){
        $data = $request->only('name', 'image', 'pets_id', 'content');
        $data['user_id'] = $auth->user()->id;
        $post = Post::create($data);
        return $post;
    }
}

Mon Validator:

<?php

namespace App\Validator;

use App\Pet;
use Illuminate\Support\Facades\Auth;
use Intervention\Image\ImageManagerStatic;

class Validator extends \Illuminate\Validation\Validator {

    public function validatePetsowner($attribute, $value, $parameters){
        if (empty($value)) {
            return false;
        }

        $pets_count = Pet::whereIn('id', $value)->where('user_id', Auth::user()->id)->count();
        //dd($pets_count);
        return count($value) == $pets_count;
        //return true;
    }

    public function validateDimension($attribute, $value, $parameters){
           //dd($value);
        $image = ImageManagerStatic::make($value);
        return $image->width() >= $parameters[0] && $image->height() >= $parameters[1];
    }

    protected function replaceDimension($message, $attribute, $value, $parameters){
        $message = str_replace(':width', $parameters[0], $message);
        $message = str_replace(':height', $parameters[1], $message);
        return $message;
    }
}

Mon Post:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Intervention\Image\ImageManagerStatic;

class Post extends Model
{
    public $fillable = ['name', 'image', 'pets_id', 'content'];

    public function getImageDir(){
        return'img/photos/' . ceil($this->id / 1000);
    }

    public function setImageAttribute($image){
        if (is_object($image) && $image->isValid()){
            self::saved(function($instance) use ($image){
                $image->move($instance->getImageDir(), $instance->id . '.' . $image->getClientOriginalExtentsion());
                ImageManagerStatic::make($image)->fit(360,200)->save($instance->getImageDir() . '/' . $instance->id . '_thumb.jpg');
                ImageManagerStatic::make($image)->fit(940,530)->save($instance->getImageDir() . '/' . $instance->id . '_large.jpg');
            });
            $this->attributes['image'] = $image->getClientOriginalExtentsion();
        }
    }
}

Mon UpdatePostRequest:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdatePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'name' => 'required|min:3',
            'image' => 'image|dimension:940,530',
            'pets_id' => 'required|petsowner'
        ];
        if ($this->method() == 'POST') {
            $rules['image'] .= '|required';
        }

        return $rules;
    }
}

Mon formulaire:

@php
    if($post->id){
        $options = ['method' => 'put', 'url' => action('PostsController@update', $post)];
    } else {
        $options = ['method' => 'post', 'url' => action('PostsController@store')];
    }
@endphp

{!! Form::model($post, $options, ['class' => 'form-horizontal', 'files' => true]) !!}

<div class="form-group">
    <label class="control-label">Nom</label>
    {!! Form::text('name', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    <label class="control-label">Image</label>
    {!! Form::file('image', ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    <label class="control-label">Description</label>
    {!! Form::textarea('content', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    <label class="control-label">Animaux</label>
    {!! Form::select('pets_id[]', Auth::user()->pets->pluck('name', 'id'), null, ['class' => 'form-control', 'multiple']) !!}
</div>

<div class="form-group">
    <button type="submit" class="btn btn-primary">
        Enregistrer
    </button>
</div>

{!! Form::close() !!}

Ce que je veux

Je veux réussir à stocker et afficher mes images correctement

Ce que j'obtiens

Mon erreur à l'affichage ->
"Image source not readable"
"Intervention\Image\Exception\NotReadableException"
"vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php:346"

6 réponses


Bonjour.
Et que ne comprends-tu pas dans le message d'erreur : Image source not readable ?

ALEEKTON
Auteur

Bonjour Lartak,
Que l'image n'est pas lisible!
Mais en faisant un dd($value);

Voir code ci-dessous:

<?php

namespace App\Validator;

use App\Pet;
use Illuminate\Support\Facades\Auth;
use Intervention\Image\ImageManagerStatic;

class Validator extends \Illuminate\Validation\Validator {

    public function validatePetsowner($attribute, $value, $parameters){
        if (empty($value)) {
            return false;
        }

        $pets_count = Pet::whereIn('id', $value)->where('user_id', Auth::user()->id)->count();
        //dd($pets_count);
        return count($value) == $pets_count;
        //return true;
    }

    public function validateDimension($attribute, $value, $parameters){
           dd($value);

        $image = ImageManagerStatic::make($value);
        return $image->width() >= $parameters[0] && $image->height() >= $parameters[1];
    }

    protected function replaceDimension($message, $attribute, $value, $parameters){
        $message = str_replace(':width', $parameters[0], $message);
        $message = str_replace(':height', $parameters[1], $message);
        return $message;
    }
}

Je récupère bien mon image:
-> "images.jpeg"
Mais je pense qu'il devrait s'agir d'un objet et pas d'une chaine de caratère.
Et cela fait plusiseurs jours que je bloque sur le sujet.
Je suis entrain de regarder dans le 'uploadedFile.php' et aussi dans le 'AbstractDecoder.php'.

Mais je peine sur ça et je ne peux pas me permettre d'avancer davantage au risque de me voir bloquer à nouveau par la suite...

Avoir le nom d'un fichier ne suffit pas pour qu'Intervention puisse travailler sur un fichier, il lui faut par exemple le chemin de celui-ci.
Il ne peut donc pas ouvrir un fichier avec seulement son nom, il faut qu'il puisse l'ouvrir pour pouvoir le traiter.

ALEEKTON
Auteur

Re Lartak,
Mon chemin est dans mon "Post"

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Intervention\Image\ImageManagerStatic;

class Post extends Model
{
    public $fillable = ['name', 'image', 'pets_id', 'content'];

    public function getImageDir(){
        return'img/photos/' . ceil($this->id / 1000);
    }

    public function setImageAttribute($image){
        if (is_object($image) && $image->isValid()){
            self::saved(function($instance) use ($image){
                $image->move($instance->getImageDir(), $instance->id . '.' . $image->getClientOriginalExtentsion());
                ImageManagerStatic::make($image)->fit(360,200)->save($instance->getImageDir() . '/' . $instance->id . '_thumb.jpg');
                ImageManagerStatic::make($image)->fit(940,530)->save($instance->getImageDir() . '/' . $instance->id . '_large.jpg');
            });
            $this->attributes['image'] = $image->getClientOriginalExtentsion();
        }
    }
}

J'imagine que c'est celui ci auquel tu fais référence?

Je fais référence au code que tu avais montré étant donné que je suppose que l'erreur vient d'une de ces classes là.
Et dans la méthode validateDimension lorsque tu fais un debug de la variable value, il n'y a que le nom du fichier et son extension, et non son chemin, et il est impossible à la librairie Intervention de pouvoir récupérer des informations sur un fichier et/ou y travailler dessus s'il ne peut pas le récupérer.

ALEEKTON
Auteur

En effet, tu résumes bien la chose. ;-)
Je récupère le nom de fichier ainsi que son extention en faisant mon dd.
Tu aurais une idée de comment je pourrais faire au vu de mon code actuel?