Mitme pildi üleslaadimine ja tihendamine PHP-s
Hiljuti küsis üks meie lugejatest, kuidas PHP-s mitu pilti üles laadida ja kokku pakkida. On teatud stsenaariume, kus peame lubama kasutajatel üles laadida mitu pilti. Alati on hea tava piltide optimeerimine üleslaadimise ajal. Selles artiklis uurime mitme pildi üleslaadimist ja kuidas pilte üleslaadimise ajal tihendada.
Miks peame pildifaili suurust vähendama?
Pole kahtlust, et piltidel on teie veebisaidil oluline roll. Pilkupüüdvad pildid tõmbavad lugejate tähelepanu ja nad veedaksid veebisaidil rohkem aega. Kuid samal ajal aeglustavad suuremahulised pildid teie veebisaiti. Kuna see võtab rohkem ribalaiust, võtab teie veebisait veebilehtede laadimiseks kauem aega. Saidi omanikud peavad pöörama tähelepanu pildifaili suuruse vähendamisele ja kasutama selle jaoks parimat pildi tihendamise tööriista.
Näitan teile kahte viisi piltide tihendamiseks – TinyPNG ja artisansweb / image-optimizer pakett.
TinyPNG on üks populaarsemaid pildikompressorite teenuseid veebis. See teenus võimaldab pakkida 500 pilti kuus tasuta nende API-de kaudu. Rohkem kui 500 pildi eest peate need maksma.
Kui peate optimeerima rohkem kui 500 pilti kuus ja ei soovi maksta, siis kasutage paketti „käsitöölisveeb / pildi optimeerija". See pakett kasutab pildi optimeerimiseks teenust reSmush.it.
Soovitaksin proovida mõlemat lahendust, võrrelda väljundit ja valida endale sobiv lahendus.
Olles seda öelnud, vaatame, kuidas pilte pärast nende üleslaadimist tihendada.
TinyPNG-ga alustamine
Alustamiseks peate hankima TinyPNG-lt API võtme. API-võtme saamiseks klõpsake siin. Peate lihtsalt sisestama oma nime ja e-posti aadressi ning saate oma võtme meili.
Kui olete oma arendaja võtme kätte saanud, installige PHP kogu, mille pakub TinyPNG. Teegi installimiseks peaks teil olema süsteemi installitud Composer. Avage terminal oma projekti juurkataloogis ja käivitage käsk:
composer require tinify/tinify
Kuidas tihendada pilte TinyPNG abil
Nagu selle artikli pealkirjas mainitud, vaatame, kuidas mitu pilti üles laadida ja kokku pakkida. Selleks peame mitme pildi sirvimiseks looma HTML-vormi, millel on failisisestus. Looge index.php
ja asetage sellesse kood allpool.
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>
Andsin failisisendile nime piltidena []. Selle põhjuseks on asjaolu, et serveri poolel vajame failide massiivi, kuna kasutaja sirvib mitut pilti.
Kui oleme pilte sirvinud ja vajutanud nuppu Esita, saadab see vormi andmed faili process_images.php
. See on fail, kuhu peame kirjutama koodi piltide üleslaadimiseks ja tihendamiseks.
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.";
}
Asendage kohatäide kindlasti oma tegeliku API-võtmega. Ülaltoodud koodis genereerime ainulaadse failinime, lisades sellele aja. Kui pilt on serverisse üles laaditud, saadame selle optimeerimiseks TinyPNG API-le. Vastutasuks saame tihendatud versiooni pildist, mille salvestame samasse kohta ja sama failinimega.
Piltide tihendamine käsitööveebi / pildi optimeerija paketi abil
Olen välja töötanud paketi Image Optimizer. See pakett kasutab piltide optimeerimiseks kapoti all olevat teenust reSmush.it. Kui otsite tasuta teenust, proovige seda paketti proovida. ReSmush.it on seni optimeerinud miljardeid pilte. See pakett ei nõua ühtegi võtit ega registreerimist. Lihtsalt ühendage see ja olete valmis.
Pildi optimeerija paketiga alustamiseks installige see käsuga:
composer require artisansweb/image-optimizer
Järgmisena muudetakse process_image.php
testamendis olevat koodi järgmiselt.
<?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.";
}
Loodan, et saate aru, kuidas PHP-s mitu pilti üles laadida ja kokku pakkida. Tahaksin kuulda teie mõtteid ja ettepanekuid allpool olevas kommentaaride jaotises.