Bildintervention mit Laravel-Speicher

Lesezeit: 7 Minuten

Wizardzebs Benutzeravatar
Zaubererzeb

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)

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

Fehlermeldung:

  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

Benutzeravatar von Leonid Shumakov
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.

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

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

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

Benutzeravatar von Clément Baconnier
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.

Kurze Antwort

Hinzufügen ->encode()hat das Problem gelöst

http://image.intervention.io/api/encode

Szenario

Im Grunde hatte ich so einen Test

Storage::fake();

$photo = factory(Photo::class)->create();    
$file = \Image::make(
    UploadedFile::fake()->image($photo->file_name, 300, 300)
);

Storage::disk($photo->disk)
    ->put(
        $photo->fullPath(),
        $file
    );

Und im Controller hatte ich so etwas

return \Image::make(
    Storage::disk($photo->disk)
        ->get(
            $photo->fullPath()
        )
)->response();

Lösung

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.

Etwas mehr recherchiert, Image tut in der Tat kodieren unter der Haube vor dem Speichern.
https://github.com/Intervention/image/blob/master/src/Intervention/Image/Image.php#L146

Meine Lösung war also, dies einfach zu tun

$file = \Image::make(
    \Illuminate\Http\UploadedFile::fake()->image('filename.jpg', 300, 300)
)->encode();

\Storage::put('photos/test.jpg', $file);

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.

$file = $request->file('avatar');
$path = $file->hashName('public/avatars');
$image = Image::make($file)->fit(300);
Storage::put($path, (string) $image->encode());

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

Ich mache es so:

  1. Ändern Sie die Größe und speichern Sie das Bild irgendwo (z. B. im öffentlichen Ordner).
  2. Erstellen Sie eine neue Datei und übergeben Sie sie an Laravel-Dateisystemfunktionen (z. B. putFileAs).
  3. 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

Benutzeravatar von Govind Samrow
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

Benutzeravatar von Sᴀᴍ Onᴇᴌᴀ
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.

Dies setzt voraus, dass Sie alle JPEGs möchten

$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);

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

1407480cookie-checkBildintervention mit Laravel-Speicher

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy