Úloha 24: Nahrání obrázku a jeho úprava (knihovna GD)
Cíl úlohy
Vytvořte skript, který umožní nahrát obrázek (JPEG) z klientského počítače na webový server prostřednictvím formuláře. Skript ověří MIME typ nahraného souboru, uloží jej do složky data/, pomocí grafické knihovny GD jej zmenší na zvolenou šířku se zachováním poměru stran a vytvoří náhledovou miniaturu.
Jak funguje nahrávání souborů v PHP
- Atribut formuláře: Formulář pro nahrávání souborů musí mít povinně nastaven atribut
enctype="multipart/form-data"a metodumethod="post". - Superglobální pole
$_FILES: Informace o nahraném souboru PHP uloží do pole:$_FILES['userfile']['name']– původní název souboru na počítači uživatele$_FILES['userfile']['type']– MIME typ hlášený prohlížečem (např.image/jpeg)$_FILES['userfile']['size']– velikost v bajtech$_FILES['userfile']['tmp_name']– dočasné umístění na serveru (např./tmp/php1234)$_FILES['userfile']['error']– kód chyby (UPLOAD_ERR_OK === 0)
- Přesun souboru: Soubor z dočasného adresáře přesuneme do cílového umístění funkcí
move_uploaded_file($tmp, $cil).
Úvahy a práce s knihovnou GD
- Zjištění rozměrů: Funkce
getimagesize($soubor)vrátí šířku, výšku a MIME typ obrázku bez nutnosti spoléhat se na příponu souboru. - Výpočet nové výšky: Aby nedošlo k deformaci obrazu, novou výšku spočítáme trojčlenkou:
$novaVyska = round($novaSirka * $staraVyska / $staraSirka);. - Resampling (vyhlazení): Funkce
imagecopyresampled()provádí kvalitní interpolaci pixelů a zajistí ostrý a vyhlazený náhled bez kostičkování.
Doplňující otázky k zamyšlení a náměty na rozšíření
- 1. Jaká bezpečnostní rizika hrozí, pokud skript nekontroluje typ a příponu souboru (např. nahrání skriptu
exploit.phpnamísto obrázku)? - 2. Které direktivy v konfiguračním souboru
php.iniomezují maximální velikost nahrávaných souborů (upload_max_filesize,post_max_size,max_execution_time)? - 3. Jak byste skript rozšířili o podporu formátů PNG a moderního formátu WebP (
imagecreatefrompng(),imagecreatefromwebp())?
Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu upload.php