Prześlij i zmień rozmiar wielu obrazów w Laravel
Oprócz tego bloga prowadzę kanał na YouTube, na którym udostępniam samouczki wideo. Ostatnio jeden z subskrybentów kanału YouTube zapytał o zmianę rozmiaru wielu obrazów w Laravelu. Chcą zmienić rozmiar wielu obrazów za jednym razem. W tym artykule dowiemy się, jak przesyłać i zmieniać rozmiar wielu obrazów w Laravel.
Intervention Image to biblioteka open source, która pozwala nam manipulować obrazami. Zamierzam użyć tej biblioteki do zmiany rozmiaru obrazów.
Pierwsze kroki
Aby osiągnąć nasz cel, musisz zainstalować i skonfigurować bibliotekę Intervention Image w projekcie Laravel. Otwórz terminal w katalogu głównym projektu i uruchom polecenie:
composer require intervention/image
Po zainstalowaniu biblioteki otwórz config/app.php
plik i dodaj dostawców usług, w nim fasadę. Dodaj dostawców usług dla tego pakietu do $providers
tablicy.
InterventionImageImageServiceProvider::class,
Dodaj fasadę do $aliases
szyku.
'Image' => InterventionImageFacadesImage::class,
Następnie potrzebujemy katalogu, w którym przechowujemy przesłane pliki. Laravel Filesystem udostępnia publiczny dysk do przechowywania plików. Dysk publiczny zawiera pliki, które są publicznie dostępne. Przesłane pliki znajdziesz w storage/app/public
folderze. Aby uzyskać dostęp do tych plików w sieci, musisz utworzyć dowiązanie symboliczne od public/storage
do storage/app/public
.
Utwórz dowiązanie symboliczne za pomocą polecenia:
php artisan storage:link
To polecenie utworzy folder przechowywania w katalogu publicznym. Tutaj przechowujemy nasze pliki.
Prześlij i zmień rozmiar obrazów w Laravel
Aby przesłać pliki na serwer, potrzebujesz formularza. Stwórzmy formularz, w którym możesz wybrać wiele plików do przesłania na serwer. Poniżej znajduje się przykładowy kod formularza, który zostanie umieszczony w pliku widoku.
<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>
W formularzu wziąłem nazwę pliku wejściowego jako „profile_image[]", która wysyła tablicę plików do serwera. Dodałem również atrybut „wiele”, który pozwala nam wybrać wiele plików. Zastąp symbol zastępczy ROUTE_URL rzeczywistą wartością.
Ponieważ musimy wgrać i zmienić rozmiar obrazów, w kontrolerze dodaj dwie fasady w następujący sposób.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image; //Intervention Image
use IlluminateSupportFacadesStorage; //Laravel Filesystem
class ImageController extends Controller
{
}
Dodając fasadę, możesz wywołać funkcje zmiany rozmiaru biblioteki obrazów interwencyjnych. W poniższym kodzie wrzucę pliki w dwóch miejscach. Jednym z nich jest oryginalny obraz. Drugi znajduje się pod katalogiem miniatur. Najpierw przesyłamy oryginalny obraz do folderu miniatur, a następnie zmieniamy jego rozmiar.
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.");
}
}
Tutaj proporcjonalnie zmieniamy rozmiar obrazu. W ten sposób zachowujemy proporcje, a obraz nie zostanie obcięty. Podaję szerokość jako 400 i wysokość jako 150. Możesz zmienić te wartości zgodnie z wymaganiami.
Śmiało i przetestuj to. Otrzymasz wersję zmiany rozmiaru przesłanych obrazów w katalogu „storage/profile_images/thumbnail”.
Jeśli szukasz twardej uprawy, zamień poniższe linie
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
Z
$img = Image::make($thumbnailpath)->resize(100, 100)->save($thumbnailpath);
Mam nadzieję, że rozumiesz, jak przesyłać i zmieniać rozmiar wielu obrazów w Laravel. Podziel się swoimi przemyśleniami i sugestiami w sekcji komentarzy poniżej.
Powiązane artykuły
- Jak przesłać plik do S3 za pomocą systemu plików Laravel?
- Jak wykonać kopię zapasową aplikacji Laravel
- Jak zintegrować biuletyn MailChimp z aplikacją Laravel?