...
✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Jak przesyłać i kompresować obrazy w Laravel?

44

Szukasz sposobu na przesyłanie i kompresowanie obrazów w Laravel? Laravel zapewnia łatwy sposób przesyłania plików. Dobrą praktyką jest kompresowanie obrazów podczas przesyłania. W tym artykule pokażę, jak wgrywać i kompresować obrazy w Laravelu.

Dlaczego trzeba kompresować obrazy?

Obrazy odgrywają ważną rolę w Twojej witrynie. Obrazy poprawiają UX i przyciągają wzrok odwiedzających. Ale jednocześnie może to również zabić wydajność witryny. Ciężkie obrazy spowalniają witrynę. W rezultacie ładowanie witryny trwa bardzo długo. Użytkownicy nie lubią wolnych stron internetowych. Jeśli Twoja witryna ładuje się dłużej, istnieje duże prawdopodobieństwo, że stracisz swoich odbiorców. Standardowy czas ładowania strony internetowej to 2 sekundy. Należy zadbać o to, aby witryna ładowała się w ciągu 2 sekund.

Chociaż istnieje kilka czynników, które należy wziąć pod uwagę, aby poprawić szybkość strony, jednym z nich jest użycie zoptymalizowanych obrazów. Kompresowanie obrazów zmniejsza rozmiar oryginalnego obrazu bez utraty jego jakości. Pomaga zwiększyć szybkość witryny.

Powiedziawszy to, zobaczmy, jak przesyłać i kompresować obrazy w Laravelu.

Przesyłanie obrazów w Laravel

Laravel zapewnia czysty sposób przesyłania obrazów. Na początek musimy najpierw stworzyć katalog, w którym będziemy przechowywać obrazy. Otwórz wiersz polecenia w katalogu głównym i uruchom poniższe polecenie.

php artisan storage:link

To polecenie tworzy katalog „storage" w folderze „public”.

Następnie utwórz formularz z danymi wejściowymi pliku i prześlij przycisk, dodając poniższy kod do pliku ostrza.

<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">
    </div>
    {{ csrf_field() }}
    <button type="submit" class="btn btn-default">Submit</button>
</form>

W powyższym kodzie HTML dodałem plik wejściowy o nazwie „profile_image”. Dodałem również {{ csrf_field() }}co jest wymagane do przesyłania formularzy Laravel.

Teraz, zakładając, że wysyłasz żądanie post do store()metody twojego kontrolera, napisz kod, który przechowuje obraz na serwerze, jak poniżej.

public function store(Request $request)
{
    if($request->hasFile('profile_image')) {
        //get filename with extension
        $filenamewithextension = $request->file('profile_image')->getClientOriginalName();
 
        //get filename without extension
        $filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
 
        //get file extension
        $extension = $request->file('profile_image')->getClientOriginalExtension();
 
        //filename to store
        $filenametostore = $filename.'_'.time().'.'.$extension;
 
        //Upload File
        $request->file('profile_image')->storeAs('public/profile_images', $filenametostore);
 
        //Compress Image Code Here
 
        return redirect('ROUTE_HERE')->with('success', "Image uploaded successfully.");
    }
}

Ten kod tworzy unikalną nazwę pliku i przechowuje plik w katalogu „profile_images”. Laravel automatycznie generuje katalog ‘profile_images’ pod ‘public/storage’, jeśli nie istnieje.

Jak wspomniano wcześniej, lepszą praktyką jest optymalizacja obrazu w momencie przesyłania. Skończyliśmy z kodem wgrania obrazu. Teraz musimy to skompresować. Zamierzam omówić 2 usługi – TinyPNG i reSmush.it, które zapewniają interfejsy API do kompresji obrazów w locie. Zobaczmy je jeden po drugim.

Kompresuj obrazy za pomocą TinyPNG w Laravel

Aby skompresować obrazy za pomocą TinyPNG API, musisz uzyskać klucz API. Proces jest prosty. Zarejestruj u nich swój adres e-mail, a oni wyślą Twój klucz programisty.

Gdy otrzymasz klucz API, dodaj go do .envpliku.

Następnie zainstaluj pakiet TinyPNG za pomocą polecenia:

composer require tinify/tinify

Po instalacji pakietu musimy napisać kod, który skompresuje przesłany obraz za pomocą TinyPNG.

Napisz kod kompresji tuż pod linią, która przesyła obraz.

//Compress Image Code Here
$filepath = public_path('storage/profile_images/'.$filenametostore);
 
try {
    TinifysetKey(env("TINIFY_API_KEY"));
    $source = TinifyfromFile($filepath);
    $source->toFile($filepath);
} catch(TinifyAccountException $e) {
    // Verify your API key and account limit.
    return redirect('ROUTE_HERE')->with('error', $e->getMessage());
} catch(TinifyClientException $e) {
    // Check your source image and request options.
    return redirect('ROUTE_HERE')->with('error', $e->getMessage());
} catch(TinifyServerException $e) {
    // Temporary issue with the Tinify API.
    return redirect('ROUTE_HERE')->with('error', $e->getMessage());
} catch(TinifyConnectionException $e) {
    // A network connection error occurred.
    return redirect('ROUTE_HERE')->with('error', $e->getMessage());
} catch(Exception $e) {
    // Something else went wrong, unrelated to the Tinify API.
    return redirect('ROUTE_HERE')->with('error', $e->getMessage());
}

Powyższy kod pobiera obraz z przesłanego katalogu, wysyła go na serwer TinyPNG w celu kompresji, a po otrzymaniu odpowiedzi przechowuje skompresowany obraz w tym samym katalogu.

Ten proces działa w tle. Nie musisz martwić się o to, jak obraz trafi na serwer TinyPNG, jak otrzyma odpowiedź API. Biblioteka TinyPNG wykona wszystkie zadania za Ciebie.

Spróbuj przesłać obraz teraz, a powinieneś zobaczyć, jak obraz jest skompresowany.

Kompresuj obrazy za pomocą reSmush.it w Laravel

TinyPNG działa dobrze, ale ma ograniczenie optymalizacji 500 darmowych obrazów miesięcznie. Jeśli chcesz skompresować więcej niż 500 zdjęć, musisz za nie zapłacić. Alternatywnie użytkownicy mogą wybrać bezpłatną usługę reSmush.it do kompresji obrazu. W chwili pisania tego artykułu reSmush.it kompresuje ponad 7 miliardów obrazów. Tyle można powiedzieć o popularności tej usługi.

Napisz więc poniższy kod, który kompresuje obrazy za pomocą reSmush.it w Laravel.

//Compress Image Code Here
$filepath = public_path('storage/profile_images/'.$filenametostore);
$mime = mime_content_type($filepath);
$output = new CURLFile($filepath, $mime, $filenametostore);
$data = ["files" => $output];
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://api.resmush.it/?qlty=80');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
if (curl_errno($ch)) {
    $result = curl_error($ch);
}
curl_close ($ch);
 
$arr_result = json_decode($result);
 
// store the optimized version of the image
$ch = curl_init($arr_result->dest);
$fp = fopen($filepath, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

Przekazałem wartość jakości 80 ?qlty=80w powyższym kodzie. Możesz bawić się przekazywaniem różnych wartości jakościowych.

Mam nadzieję, że rozumiesz, jak przesyłać i kompresować obrazy w Laravel. Chciałbym usłyszeć wasze przemyślenia i sugestie w sekcji komentarzy poniżej.

Powiązane artykuły

Źródło nagrywania: artisansweb.net

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów