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
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());
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é.
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());