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

Prześlij i skompresuj wiele obrazów w PHP

27

Ostatnio jeden z naszych czytelników zapytał, jak przesłać i skompresować wiele obrazów w PHP. Istnieją pewne scenariusze, w których musimy umożliwić użytkownikom przesyłanie wielu obrazów. Dobrą praktyką jest zawsze optymalizacja obrazów podczas przesyłania. W tym artykule przyjrzymy się przesyłaniu wielu obrazów i temu, jak kompresować obrazy podczas procesu przesyłania.

Dlaczego musimy zmniejszyć rozmiar pliku obrazu?

Bez wątpienia obrazy odgrywają ważną rolę w Twojej witrynie. Przyciągające wzrok obrazy przyciągają uwagę czytelników i spędzają więcej czasu na stronie. Ale jednocześnie duże obrazy spowalniają Twoją witrynę. Ponieważ wymaga większej przepustowości, Twoja witryna zajmuje więcej czasu, aby załadować strony internetowe. Właściciele witryn muszą zwracać uwagę, aby zmniejszyć rozmiar pliku obrazu i użyć do tego najlepszego narzędzia do kompresji obrazu.

Pokażę Ci 2 sposoby kompresji obrazów – TinyPNG oraz pakiet artisansweb/image-optimizer.

TinyPNG to jedna z popularnych usług kompresji obrazu w sieci. Ta usługa umożliwia bezpłatną kompresję 500 obrazów miesięcznie za pośrednictwem ich interfejsów API. Za więcej niż 500 zdjęć musisz im zapłacić.

Jeśli musisz zoptymalizować więcej niż 500 zdjęć miesięcznie i nie chcesz płacić, skorzystaj z pakietu „artisansweb/image-optimizer". Ten pakiet wykorzystuje usługę reSmush.it do optymalizacji obrazu.

Polecam wypróbowanie obu rozwiązań, porównanie wyników i wybranie tego, które jest dla Ciebie odpowiednie.

Powiedziawszy to, przyjrzyjmy się, jak skompresować obrazy po ich przesłaniu.

Pierwsze kroki z TinyPNG

Aby rozpocząć, musisz uzyskać klucz API od TinyPNG. Kliknij tutaj, aby otrzymać klucz API. Wystarczy wpisać swoje imię i nazwisko oraz adres e-mail, a otrzymasz e-mail z kluczem.

Prześlij i skompresuj wiele obrazów w PHP

Po otrzymaniu klucza programisty zainstaluj bibliotekę PHP dostarczoną przez TinyPNG. Aby zainstalować bibliotekę, w systemie powinien być zainstalowany Composer. Otwórz terminal w katalogu głównym projektu i uruchom polecenie:

composer require tinify/tinify

Jak kompresować obrazy za pomocą TinyPNG

Jak wspomniano w tytule tego artykułu, zobaczymy, jak przesłać i skompresować wiele obrazów. W tym celu musimy utworzyć formularz HTML, który zawiera plik wejściowy do przeglądania wielu obrazów. Utwórz index.phpi umieść w nim poniższy kod.

index.php

<form method="post" enctype="multipart/form-data" action="process_images.php">
    <p>
        <label>Upload Images</label>
        <input type="file" name="images[]" accept="image/*" multiple>
    </p>
    <button type="submit" name="submit">Submit</button>
</form>

Do pliku wejściowego nadałem nazwę jako images[]. Dzieje się tak, ponieważ po stronie serwera potrzebujemy tablicy plików, ponieważ użytkownik będzie przeglądał wiele obrazów.

Po przejrzeniu zdjęć i naciśnięciu przycisku przesyłania dane formularza zostaną przesłane do pliku process_images.php. Jest to plik, w którym musimy napisać kod do przesyłania i kompresji obrazów.

process_images.php

<?php
// Increase PHP execution time
set_time_limit(0);
 
require_once("vendor/autoload.php");
TinifysetKey("YOUR_API_KEY");
 
if (isset($_POST['submit'])) {
    $supported_images = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png');
 
    if (!file_exists(getcwd(). '/uploads')) {
        mkdir(getcwd(). '/uploads', 0777);
    }
  
    foreach($_FILES['images']['name'] as $key=>$val) {
        $file_name = $_FILES['images']['name'][$key];
  
        // get file extension
        $ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
  
        // get filename without extension
        $filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);
  
        if (in_array($_FILES['images']['type'][$key], $supported_images)) {
            $filename_to_store = $filenamewithoutextension.'_'.time().'.' .$ext;
            move_uploaded_file($_FILES['images']['tmp_name'][$key], getcwd().'/uploads/'.$filename_to_store);
  
            // optimize image using TinyPNG
            try {
                $source = TinifyfromFile(getcwd().'/uploads/'.$filename_to_store);
                $source->toFile(getcwd().'/uploads/'.$filename_to_store);
            } catch(Exception $e) {
                echo $e->getMessage();
                exit;
            }
        }
    }
    echo "Files uploaded successfully.";
}

Pamiętaj, aby zastąpić symbol zastępczy rzeczywistym kluczem API. W powyższym kodzie generujemy unikalną nazwę pliku dodając do niej czas. Po przesłaniu obrazu na serwer wysyłamy obraz do API TinyPNG w celu optymalizacji. W zamian otrzymujemy skompresowaną wersję obrazu, który przechowujemy w tym samym miejscu i pod tą samą nazwą pliku.

Kompresuj obrazy za pomocą pakietu artisansweb/image-optimizer

Opracowałem pakiet Image Optimizer. Ten pakiet wykorzystuje usługę reSmush.it pod maską do optymalizacji obrazów. Jeśli szukasz bezpłatnej usługi, wypróbuj ten pakiet. ReSmush.it do tej pory zoptymalizował miliardy obrazów. Ten pakiet nie wymaga podawania żadnego klucza ani rejestracji. Po prostu podłącz i gotowe.

Aby rozpocząć korzystanie z pakietu Image Optimizer, zainstaluj go za pomocą polecenia:

composer require artisansweb/image-optimizer

Następnie kod w process_image.phpzostanie zmodyfikowany w następujący sposób.

<?php
// Increase PHP execution time
set_time_limit(0);
 
require_once("vendor/autoload.php");
 
use ArtisansWebOptimizer;
 
if (isset($_POST['submit'])) {
    $supported_images = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png');
 
    if (!file_exists(getcwd(). '/uploads')) {
        mkdir(getcwd(). '/uploads', 0777);
    }
  
    foreach($_FILES['images']['name'] as $key=>$val) {
        $file_name = $_FILES['images']['name'][$key];
  
        // get file extension
        $ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
  
        // get filename without extension
        $filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);
  
        if (in_array($_FILES['images']['type'][$key], $supported_images)) {
            $filename_to_store = $filenamewithoutextension.'_'.time().'.' .$ext;
            move_uploaded_file($_FILES['images']['tmp_name'][$key], getcwd().'/uploads/'.$filename_to_store);
  
            // optimize image
            try {
                $img = new Optimizer();
                $source = getcwd().'/uploads/'.$filename_to_store;
                $img->optimize($source);
 
            } catch(Exception $e) {
                echo $e->getMessage();
                exit;
            }
        }
    }
    echo "Files uploaded successfully.";
}

Mam nadzieję, że rozumiesz, jak przesyłać i kompresować wiele obrazów w PHP. 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