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).
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());
Ich mache es so:
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);
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.
Das Hinzufügen von ->encode()
löste das Problem
http://image.intervention.io/api/encode
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();
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
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.
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]);
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);
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);
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);