web-dev-qa-db-fra.com

Image d'intervention avec Laravel 5.4 Storage

J'utilise la façade de stockage pour stocker un avatar qui fonctionne bien, mais je souhaite redimensionner mon image comme je l'avais fait dans les versions précédentes de Laravel . Comment puis-je procéder??. Voici ce que j'ai jusqu'à présent (ne fonctionne pas)

  $path   = $request->file('createcommunityavatar');
  $resize = Image::make($path)->fit(300);
  $store  = Storage::putFile('public/image', $resize);
  $url    = Storage::url($store);

Message d'erreur:

  Command (hashName) is not available for driver (Gd).
14
CriticalTheWizard

Vous essayez de passer dans putFile mauvais objet. Cette méthode attend l'objet File (pas Image).

$path   = $request->file('createcommunityavatar');

// returns \Intervention\Image\Image - OK
$resize = Image::make($path)->fit(300);

// expects 2nd arg - \Illuminate\Http\UploadedFile - ERROR, because Image does not have hashName method
$store  = Storage::putFile('public/image', $resize);

$url    = Storage::url($store);

Ok, maintenant que nous comprenons la raison principale, corrigeons le code

// returns Intervention\Image\Image
$resize = Image::make($path)->fit(300)->encode('jpg');

// calculate md5 hash of encoded image
$hash = md5($resize->__toString());

// use hash as a name
$path = "images/{$hash}.jpg";

// save it locally to ~/public/images/{$hash}.jpg
$resize->save(public_path($path));

// $url = "/images/{$hash}.jpg"
$url = "/" . $path;

Imaginons que vous souhaitiez utiliser la façade de stockage:

// does not work - Storage::putFile('public/image', $resize);

// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
16
Leonid Shumakov

Je le fais de cette façon:

  1. Redimensionnez et enregistrez l'image quelque part (comme dans le dossier public).
  2. Créez un nouveau fichier et transmettez-le aux fonctions du système de fichiers Laravel (telles que putFileAs).
  3. Supprimer le fichier d'intervention temporaire

Remarque: vous pouvez bien entendu le modifier en fonction de vos besoins.

$file = $request->file('portfolio_thumb_image');

$image = Image::make($file);

$image->resize(570, 326, function ($constraint) {
    $constraint->aspectRatio();
});

$thumbnail_image_name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME).'.'.$file->getClientOriginalExtension();

$image->save(public_path('images/'.$thumbnail_image_name));

$saved_image_uri = $image->dirname.'/'.$image->basename;

//Now use laravel filesystem.
$uploaded_thumbnail_image = Storage::putFileAs('public/thumbnails/'.$portfolio_returned->id, new File($saved_image_uri), $thumbnail_image_name);

//Now delete temporary intervention image as we have moved it to Storage folder with Laravel filesystem.
$image->destroy();
unlink($saved_image_uri);
3

La méthode put fonctionne avec le résultat de l 'intervention Image . La méthode putFile accepte les instances Illuminate\Http\File ou Illuminate\Http\UploadedFile.

$photo = Image::make($request->file('photo'))
  ->resize(400, null, function ($constraint) { $constraint->aspectRatio(); } )
  ->encode('jpg',80);

Storage::disk('public')->put( 'photo.jpg', $photo);

Le code ci-dessus redimensionne le fichier téléchargé à une largeur de 400 px tout en maintenant les proportions. Encode ensuite en jpg avec une qualité de 80% . Le fichier est ensuite stocké sur le disque public . Notez que vous devez fournir un nom de fichier, pas seulement le répertoire.

2
Jeffrey

Assurez-vous d’ajouter use Illuminate\Http\File; en haut de votre fichier pour que cela fonctionne, et parcourez la section documentation diffusion automatique en continu .

Cela suppose que vous voulez tous les jpegs

$path   = $request->file('createcommunityavatar');
$resize = Image::make($path)->fit(300)->encode('jpg');
$filePath = $resize->getRealPath() . '.jpg';
$resize->save($filePath);
$store  = Storage::putFile('public/image', new File($resize));
$url    = Storage::url($store);

Voici comment je le fais dans mon application avec des commentaires pour aider

// Get the file from the request
$requestImage = request()->file('image');

// Get the filepath of the request file (.tmp) and append .jpg
$requestImagePath = $requestImage->getRealPath() . '.jpg';

// Modify the image using intervention
$interventionImage = Image::make($requestImage)->resize(125, 125)->encode('jpg');

// Save the intervention image over the request image
$interventionImage->save($requestImagePath);

// Send the image to file storage
$url = Storage::putFileAs('photos', new File($requestImagePath), 'thumbnail.jpg');

return response()->json(['url' => $url]);
1
Rob

Je l'ai fait de la manière suivante, c'est simple et sans confusion de chemin:

//Get file
$path= $request->file('createcommunityavatar');

// Resize and encode to required type
$img = Image::make($file)->fit(300)->encode('jpg');

//Provide own name
$name = time() . '.jpg';

//Put file with own name
Storage::put($name, $img);

//Move file to your location 
Storage::move($name, 'public/image/' . $name);
0
Govind Samrow

Vous ne pouvez pas stocker un objet\Intervention\Image\Image directement avec le système de fichiers Laravel 5. Ce que vous pouvez faire, c'est redimensionner l'image à partir de votre demande et la sauvegarder sous le même chemin tmp. Ensuite, stockez simplement le fichier téléchargé (écrasé) dans le système de fichiers. 

Code:

$image  = $request->file('createcommunityavatar');
//resize and save under same tmp path
$resize = Image::make($image)->fit(300)->save();
// store in the filesystem with a generated filename
$store  = $image->store('image', 'public');
// get url from storage
$url    = Storage::url($store);
0
Jones03

Essayez de mettre à jour l'extension Gd pour la version actuelle de PHP.

Si cela ne vous aide pas, essayez d'enregistrer l'image redimensionnée sur un disque local et utilisez Storage :: putFile.

Vous pouvez supprimer le fichier une fois qu’il a été téléchargé sur votre chemin de stockage.

Le second paramètre de votre méthode putFile est une instance de la classe Image Intervention. Vous devez le transmettre comme second paramètre à la méthode putFile. 

$resize->save($absolutePath . 'small/' . $imageName);
0
Himanshu Sharma