Ich verwende die Speicherfassade, um einen Avatar zu speichern, der gut funktioniert, aber ich möchte die Größe meines Bildes ändern, wie ich es in früheren Versionen von Laravel getan habe. Wie kann ich das anstellen? Hier ist, was ich bisher habe (funktioniert nicht)
Command (hashName) is not available for driver (Gd).
Hallo versuchen Sie dieses Image::make($path)->resize(300, 300);
– Vision Coderz
13. Oktober 2016 um 15:49 Uhr
Das gab mir den gleichen Fehler wie zuvor. Command (hashName) is not available for driver (Gd).
– Wizardzeb
13. Oktober 2016 um 16:26 Uhr
Wurde das gelöst?
– dbr
12. November 2016 um 22:25 Uhr
@CriticalTheWizard Ändern des Treibers zu imagick hat nicht geholfen. Jetzt bekomme ich Command (hashName) is not available for driver (Imagick).
– dbr
12. November 2016 um 22:42 Uhr
Leonid Schumakow
Sie versuchen, das falsche Objekt in putFile zu übergeben. Diese Methode erwartet ein File-Objekt (nicht 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, jetzt, wo wir den Hauptgrund verstehen, reparieren wir den 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 = "https://stackoverflow.com/" . $path;
Stellen wir uns vor, Sie möchten die Storage-Fassade verwenden:
// does not work - Storage::putFile('public/image', $resize);
// Storage::put($path, $contents, $visibility = null)
Storage::put('public/image/myUniqueFileNameHere.jpg', $resize->__toString());
Der obige Code funktioniert einwandfrei, mit einer Anmerkung: md5($resize->__toString()); gibt immer den gleichen Hash für die gleiche Datei zurück, was in manchen Fällen problematisch sein kann. In meiner Lösung habe ich das durch ersetzt $now = Carbon::now()->toDateTimeString(); $hash = md5($image->__toString().$now);
– Tomasz Machura
4. Januar 2018 um 21:19 Uhr
Das stellen -Methode arbeitet mit der Ausgabe der Bildintervention. Das putFile -Methode akzeptiert entweder eine Illuminate\Http\File- oder Illuminate\Http\UploadedFile-Instanz.
Der obige Code ändert die Größe der hochgeladenen Datei auf eine Breite von 400 Pixel, während das Seitenverhältnis beibehalten wird. Kodiert dann in jpg mit 80% Qualität. Die Datei wird dann auf der öffentlichen Platte gespeichert. Beachten Sie, dass Sie einen Dateinamen angeben müssen, nicht nur das Verzeichnis.
Vielen Dank! Sehr hilfreich. Notiere dass der encode Aufruf erforderlich, da sonst die Ausgabe beschädigt wird.
– Adam
29. Mai 2020 um 8:11 Uhr
Und Sie können es auch so verwenden: Storage::disk('public')->put( $request->file('photo')->hashName(), $photo);
– Adam
29. Mai 2020 um 8:12 Uhr
Wirklich hilfreich für mich
– AA Noman
23. September 2020 um 12:35 Uhr
Clemens Baconnier
Mit Laravel 5.8
Ich hatte ein ähnliches Problem beim Versuch lesen eine Bilddatei mit Image wann dieser war Gerettet und geladen mit Storage.
Neben all den Antworten war ich mir nicht sicher, warum es nicht funktionierte.
Ausnahme wann Image versuchte die Datei zu lesen
Intervention\Image\Exception\NotReadableException : Aus gegebenen Binärdaten kann nicht initialisiert werden.
Nach einer Untersuchung stellte ich fest, dass jede Datei, die von erstellt wurde Image und gespeichert durch die Storage hatte eine Größe von 0 Oktette. Nachdem ich mir alle Lösungen aus diesem Beitrag und einige Stunden später angesehen hatte, bemerkte ich, dass alle sie verwendeten encode() aber niemand hat erwähnt, dass es das war. Also habe ich es versucht und es hat funktioniert.
prüfbar ein BastelnEs wird ein schwarzes Bild erstellt
Das ist die gleiche Lösung wie bei stackoverflow.com/a/43700717/2311074
– Adam
29. Mai 2020 um 8:13 Uhr
Es funktionierte auch beim Hochladen einer base64-decodierten Bilddatei und beim Speichern im Speicher. Ohne die Funktion encode() zu verwenden, wurde sie bei der Verwendung nicht hochgeladen Storage::put($file_path, base64_encode($uploadedFile);. Mit Interventionsbild und Codierfunktion hat es endlich funktioniert.
– Mycodingproject
15. Juli 2020 um 6:47 Uhr
Die sauberste Lösung, die ich finden konnte – mit dem nativen Storage Fassade – ist die folgende. Ich kann bestätigen, dass dies in Laravel 5.7 funktioniert, indem ich verwende intervention/image Version 2.4.2.
Ändern Sie die Größe und speichern Sie das Bild irgendwo (z. B. im öffentlichen Ordner).
Erstellen Sie eine neue Datei und übergeben Sie sie an Laravel-Dateisystemfunktionen (z. B. putFileAs).
Temporäre Interventionsdatei löschen
Hinweis: Natürlich können Sie es nach Ihren Bedürfnissen modifizieren.
$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."https://stackoverflow.com/".$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);
Es funktioniert gut. Dies sollte auch die akzeptierte Antwort sein.
– Rafik Farhad
17. Oktober 2019 um 12:58 Uhr
Govind Samrow
Ich habe es auf folgende Weise gemacht, es ist einfach und ohne Pfadverwirrung:
//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);
Es funktioniert gut. Dies sollte auch die akzeptierte Antwort sein.
– Rafik Farhad
17. Oktober 2019 um 12:58 Uhr
Sᴀᴍ Onᴇᴌᴀ
Unbedingt hinzufügen use Illuminate\Http\File; an den Anfang Ihrer Datei, damit dies funktioniert, und lesen Sie den Dokumentationsabschnitt durch Automatisches Streamen.
So mache ich es in meiner Bewerbung mit Kommentaren, um zu helfen
// 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]);
Meinten Sie $filePath = $resize->getRealPath() . '.jpg';
– Wizardzeb
13. Dezember 2016 um 23:49 Uhr
Ich habe es bei einer Neuinstallation von Laravel 5.3. * ausprobiert, das funktioniert. Hast du es ausprobiert?
– Rauben
14. Dezember 2016 um 1:02 Uhr
was für eine neue Datei verwendest du hier? http-Datei oder Fassadendatei?
– Lösche beide
16. Februar 2017 um 13:56 Uhr
Verwenden Sie die File Fassade.
– Dale Ryan
8. September um 7:45
14074800cookie-checkBildintervention mit Laravel-Speicheryes
Hallo versuchen Sie dieses Image::make($path)->resize(300, 300);
– Vision Coderz
13. Oktober 2016 um 15:49 Uhr
Das gab mir den gleichen Fehler wie zuvor.
Command (hashName) is not available for driver (Gd).
– Wizardzeb
13. Oktober 2016 um 16:26 Uhr
Wurde das gelöst?
– dbr
12. November 2016 um 22:25 Uhr
@CriticalTheWizard Ändern des Treibers zu
imagick
hat nicht geholfen. Jetzt bekomme ichCommand (hashName) is not available for driver (Imagick).
– dbr
12. November 2016 um 22:42 Uhr