Ladda upp och ändra storlek på flera bilder i Laravel
Förutom den här bloggen driver jag en YouTube-kanal där jag delar videotutorialerna. Nyligen frågade en av YouTube-kanalprenumeranterna om att ändra storlek på flera bilder i Laravel. De vill ändra storlek på flera bilder på en gång. I den här artikeln studerar vi hur man laddar upp och ändrar storlek på flera bilder i Laravel.
Intervention Image är ett bibliotek med öppen källkod som låter oss manipulera bilder. Jag ska använda detta bibliotek för att ändra storlek på bilder.
Komma igång
För att nå vårt mål måste du installera och konfigurera Intervention Image-biblioteket i Laravel-projektet. Öppna terminalen i din projektkatalog och kör kommandot:
composer require intervention/image
När biblioteket är installerat öppnar du config/app.php
filen och lägger till tjänsteleverantörer, fasad i den. Lägg till tjänsteleverantörerna för detta paket i $providers
matrisen.
InterventionImageImageServiceProvider::class,
Lägg till fasaden i $aliases
matrisen.
'Image' => InterventionImageFacadesImage::class,
Därefter behöver vi en katalog där vi lagrar våra uppladdade filer. Laravel Filesystem tillhandahåller en offentlig disk för att lagra filerna. Den offentliga disken innehåller filer som är offentligt tillgängliga. Du hittar de uppladdade filerna i storage/app/public
mappen. För att komma åt dessa filer på webben måste du skapa en symbolisk länk från public/storage
till storage/app/public
.
Skapa en symbolisk länk med kommandot:
php artisan storage:link
Detta kommando skulle skapa en lagringsmapp under den offentliga katalogen. Det är här vi lagrar våra filer.
Ladda upp och ändra storlek på bilder i Laravel
För att ladda upp filer på en server behöver du ett formulär. Låt oss skapa ett formulär där du kan välja flera filer att ladda upp på en server. Nedan följer en exempelkod av formuläret som kommer att finnas i din vyfil.
<form action="{{ url('ROUTE HERE') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image[]" id="exampleInputFile" multiple />
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
I formuläret har jag tagit ett filinmatningsnamn som ‘profile_image []’ som skickar en rad filer till servern. Jag lade också till ett attribut ‘multipel’ som låter oss välja flera filer. Ersätt platshållaren ROUTE_URL med ditt faktiska värde.
Eftersom vi behöver ladda upp och ändra storlek på bilderna, lägg till två fasader i kontrollen enligt följande.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image; //Intervention Image
use IlluminateSupportFacadesStorage; //Laravel Filesystem
class ImageController extends Controller
{
}
Genom att lägga till fasaden kan du ange storleksfunktionerna i Intervention Image-biblioteket. I koden nedan laddar jag upp filerna på två platser. En är originalbilden. Den andra finns under miniatyrkatalogen. Vi laddar först upp originalbilden i miniatyrmappen och ändrar sedan storlek på den.
public function store(Request $request)
{
if ($request->hasFile('profile_image')) {
foreach($request->file('profile_image') as $file){
//get filename with extension
$filenamewithextension = $file->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $file->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.uniqid().'.'.$extension;
Storage::put('public/profile_images/'. $filenametostore, fopen($file, 'r+'));
Storage::put('public/profile_images/thumbnail/'. $filenametostore, fopen($file, 'r+'));
//Resize image here
$thumbnailpath = public_path('storage/profile_images/thumbnail/'.$filenametostore);
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
}
return redirect('ROUTE_URL')->with('success', "Image uploaded successfully.");
}
}
Här ändrar vi storleken på bilden proportionellt. Genom att göra det behåller vi bildförhållandet och bilden skärs inte av. Jag passerar bredden som 400 och höjden som 150. Du kan ändra dessa värden enligt dina krav.
Fortsätt och testa det. Du kommer att få storleksversionen av uppladdade bilder i katalogen ‘lagring / profil_bilder / miniatyrbild’.
Om du letar efter hård skörd, byt ut nedanför raderna
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
Med
$img = Image::make($thumbnailpath)->resize(100, 100)->save($thumbnailpath);
Jag hoppas att du förstår hur du laddar upp och ändrar storlek på flera bilder i Laravel. Dela dina tankar och förslag i kommentarsektionen nedan.
relaterade artiklar
- Hur laddar jag upp filen till S3 med Laravel Filesystem
- Hur man tar backup av Laravel Application
- Hur man integrerar MailChimp nyhetsbrev i Laravel Application