wake-up-neo.com

Bildintervention mit Laravel 5.4 Lagerung

Ich verwende die Speicherfassade, um einen Avatar zu speichern, der gut funktioniert, aber ich möchte mein Bild wie in früheren Versionen von laravel skalieren bisher (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).
14

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, wenn wir nun den Hauptgrund verstehen, korrigieren 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 = "/" . $path;

Stellen wir uns vor, Sie möchten die Speicherfassade verwenden:

// 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

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 an Ihre Bedürfnisse anpassen.

$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

Mit Laravel 5.8

Ich hatte ein ähnliches Problem beim Versuch, eine Bilddatei mit Image zu lesen , als diese war. gespeichert und geladen mit Storage.
Abgesehen von all den Antworten war ich mir nicht sicher, warum es nicht funktionierte.


Ausnahme, als Image versuchte, die Datei zu lesen

Intervention\Image\Exception\NotReadableException: Aus gegebenen Binärdaten kann keine Initialisierung durchgeführt werden.

Kurze Antwort

Das Hinzufügen von ->encode() löste das Problem

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

Szenario

Im Grunde hatte ich einen Test wie diesen

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 in der Steuerung 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 Image erstellt und von Storage gespeichert wurde, eine Größe von 0 Oktetten hatte. Nachdem ich mir alle Lösungen aus diesem Beitrag angesehen hatte und einige Stunden später, bemerkte ich, dass jeder encode() verwendete, aber niemand erwähnte, dass es das war. Also habe ich es versucht und es hat funktioniert.

Wenn Sie etwas mehr nachforschen, verschlüsselt Image tatsächlich 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);

testbar in Basteln , es wird ein schwarzes Bild erstellt

3
cbaconnier

Die Methode put arbeitet mit der Image-Interventionsausgabe . Die Methode putFile akzeptiert entweder eine Illuminate\Http\File- oder eine 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 400px Breite, während das Seitenverhältnis beibehalten wird. Kodiert dann in jpg mit einer Qualität von 80%. Die Datei wird dann auf der öffentlichen CD/DVD gespeichert. Beachten Sie, dass Sie einen Dateinamen angeben müssen, nicht nur das Verzeichnis.

2
Jeffrey

Stellen Sie sicher, dass Sie use Illuminate\Http\File; oben in Ihre Datei einfügen, damit dies funktioniert, und lesen Sie den Dokumentationsabschnitt Automatisches Streaming .

Dies setzt voraus, dass Sie alle JPEGs wollen

$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]);
1
Rob

Die sauberste Lösung, die ich mit der nativen Fassade Storage finden konnte, ist die folgende. Ich kann bestätigen, dass dies in Laravel 5.7 mit intervention/image Version 2.4.2 funktioniert.

$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 habe es mit folgendem Weg gemacht, es ist einfach und ohne jegliche Verwirrung auf dem Pfad:

//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

Sie können ein\Intervention\Image\Image-Objekt nicht direkt mit dem Laravel 5-Dateisystem speichern. Was Sie tun können, ist, das Bild von Ihrer Anfrage aus zu verkleinern und unter demselben tmp-Pfad zu speichern. Dann speichern Sie einfach die hochgeladene (überschriebene) Datei im Dateisystem. 

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

Aktualisieren Sie die Gd-Erweiterung für die aktuelle PHP-Version.

Wenn dies nicht hilft, speichern Sie das verkleinerte Image auf der lokalen Festplatte und verwenden Sie Storage :: putFile.

Sie können die Datei löschen, sobald sie in Ihren Ablagepfad hochgeladen wurde.

Der zweite Parameter Ihrer putFile-Methode ist eine Instanz der Image Intervention-Klasse. Sie müssen dies als zweiten Parameter an die putFile-Methode übergeben. 

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