Úloha 24: Nahrání obrázku a jeho úprava (knihovna GD)

Pokročilý $_FILES move_uploaded_file() knihovna GD imagecopyresampled()

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 metodu method="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.php namísto obrázku)?
  • 2. Které direktivy v konfiguračním souboru php.ini omezují 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