web-dev-qa-db-fra.com

Source de l'image non lisible dans Laravel 5.2 - Image d'intervention

J'ai un petit problème concernant le processus de redimensionnement d'une image donnée, je tente de soumettre un formulaire contenant un type d'entrée -> fichier <- j'ai pu télécharger une image sans la redimensionner. J'ai donc installé la bibliothèque d'images d'intervention en utilisant:

composer require intervention/image

puis j'ai intégré la bibliothèque dans mon framework Laravel

Intervention\Image\ImageServiceProvider::class
'Image' => Intervention\Image\Facades\Image::class

et enfin je l'ai configuré comme suit

php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

mon contrôleur est comme le suivant

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Image; 

class ProjectController extends Controller{

public function project(Request $request){  


    $file = Input::file('file');
    $fileName = time().'-'.$file->getClientOriginalName();

    $file -> move('uploads', $fileName);
    $img=Image::make('public/uploads/', $file->getRealPath())->resize(320, 240)->save('public/uploads/',$file->getClientOriginalName());

}
}

mais au lieu de redimensionner la photo, l'exception suivante est levée

NotReadableException in AbstractDecoder.php line 302:
Image source not readable
11
KaldoLeb

Ne devrait-ce pas être Image::make($file->getRealPath()) au lieu de Image::make('public/uploads/', $file->getRealPath())?

Image::make() ne semble pas prendre deux arguments, cela pourrait donc être votre problème.

Essaye ça:

$file = Input::file('file');
$fileName = time() . '-' . $file->getClientOriginalName();

$file->move('uploads', $fileName);

$img = Image::make($file->getRealPath())
    ->resize(320, 240)
    ->save('public/uploads/', $file->getClientOriginalName());

Ou si vous voulez le faire sans déplacer le fichier au préalable, essayez ceci:

$file = Input::file('file');
$img = Image::make($file)
    ->resize(320, 240)
    ->save('public/uploads/', $file->getClientOriginalName());
12
borfast

Dans L5.2, il n'est pas directement possible d'obtenir une image de la façade Input. Pour cela, nous devons d’abord stocker l’image sur le serveur, puis donner le chemin dans la façade Image pour effectuer des opérations sur l’image. 

Le code va comme ceci:

if ($request->hasFile('picture') ) {

        $destinationPath = public_path('uploads/user');
        $photoname = date("YmdHis");
        $file_extention = '.'.$request->file('picture')->getClientOriginalExtension();
        $photo = $photoname.$file_extention;
        $file_check = $request->file('picture')->move($destinationPath, $photo);

        $thumb_path = $destinationPath.'/thumbnail/'.$photo;

        $new_filePath =  $destinationPath.'/'.$photo;

        $assets_path = url('uploads/user/');

        $img = Image::make($assets_path.'/'.$photo)->fit(100)->save($thumb_path,40);

        $data['picture'] = $photo;           
    }

Je recherchais une solution directe, c’est-à-dire qu’il était possible auparavant de prendre une image directement à partir de la façade Input. Si quelqu'un d'entre vous a une solution directe, affichez votre code ici et je vous récompenserai de cette prime. À votre santé.

2
Tarunn

Télécharger un fichier et le redimensionner avant de le sauvegarder est aussi simple que cela:

Vous pouvez directement passer une instance de UploadedFile à InterventionImage :: make ()

public function upload(Request $request)
{
    $file = $request->file('file');

    $filename = $file->getClientOriginalName();

    $img = \Image::make($file);
    $img->resize(320, 240)->save(public_path('uploads/'.$filename))

}

Si vous souhaitez enregistrer la taille d'origine et l'image redimensionnée: 

    $img->save(public_path('uploads/'.$filename))
        ->resize(320, 240)
        ->save(public_path('uploads/thumb_'.$filename));

Ceci vient d'être testé sur la dernière version 5.2 actuelle avec 5.2.45

[MODIFIER:]

Si vous appelez 

$file->move();

Ne pas utiliser 

$file->getRealPath() 

après, parce que cela retournera false après avoir appelé move ()

    $filename = $file->getClientOriginalName();
    $file->move('uploads', $filename);
    dd($file->getRealPath());
0
shock_gone_wild