Upload obrázku v PHP

Jednou ze základních věcí, které se nevyhne asi žádný webový vývojář je příjem obrázků zadávaných uživatelem. Pojďme se nyní podívat jak se vůbec upload obrázku v PHP realizuje.
[ad code=1 align=center]
Nejprve musíme mít formulář, který zajistí zadání obrázku.

<form action="#" enctype="multipart/form-data" method="post"> 
 
 
</form>

K tomu aby byly předány informace u soboru, musíme v tagu <form> uvést vlastnost :

enctype="multipart/form-data"

Zpracování na straně serveru v PHP

Tak a nyní se dostáváme (podle mně) k té nejzajímavší částí a to samotnému zpracování obrázku. Tak nejprve bysme měli vědět, že obrázek nám dorazí v proměnné $_FILES[‚soubor‘], tato proměnná je vlastně pole, které má v sobě uloženo několik hodnot a to:

  • ['name'] – relativní cesta k obrázku
  • ['tmp_name'] – dočasný název obrázku
  • ['type'] – typ obrázku (image/jpeg,image/gif,image/png)

A nyní hurá do akce:

  1. Vložíme podmínku pro ošetření kliknutí na tlačítko nahrát. Pokud uživate klikne na tlačítko, v proměnné $_POST['s'] nalezneme hodnotu true.
     
  2. Nyní ošetříme vstup od uživatele. K tomu, aby uživatel mohl nahrát jen nějaké typy obrázků, poslouží následující podmínka vložená do naší první podmínky.
     
  3. Nyní přistoupíme k samotnému jádru aplikace. Prvně si připravíme pro zjednodušení několik proměnných. Veškerý kód budeme již vkládat do podmínky if.
    //adresář kam bude probíhat upload obrázku
    $adresar = "upload/img/";
    //název obrázku, jedná se o dočasný název, který je použit při přenosu obrázku
    $nazev_souboru = $_FILES['logo']['tmp_name'];
    //cíl, obrázek budem ukládat např. do upload/img/prvni.png
    $cil = $adresar.$_FILES["logo"]['name'];
  4. Samotný upload na server provedeme následovně:
    //občas se stane že server nastaví obrázku práva tak že s ním později nemůže manipulovat
    //tato funkce zajistí správné nastavení přístupových práv
    umask(0);
    //samotný upload souboru, pokud dojde k chybě, zobrazíme uživateli hlášku
    move_uploaded_file($nazev_souboru, $cil)or die("Přenášený obrázek nelze zkopírovat.
    <a href="">Zpět</a>");
  5. Jako poslední zajístíme změnu názvu obrázku, kterou provedeme následovně:
    //zde můžeme nastavit nový název obrázku
    $novy_nazev = $adresar.time().".jpg";
    //pomocí funkce rename provedeme změnu názvu
    rename( $cil, $novy_nazev );
    //nakonec provedeme změnu práv na 777
    chmod($novy_nazev, 0777);

Výsledný soubor upload.php by mohl vypadat nějak následovně:

&lt;?php 
if($_POST[&#039;s&#039;]){ 
    if($_FILES[&quot;logo&quot;][&#039;type&#039;] == &#039;image/jpeg&#039; &amp;&amp; $_FILES[&quot;logo&quot;][&#039;type&#039;] == &#039;image/gif&#039; 
        &amp;&amp; $_FILES[&quot;logo&quot;][&#039;type&#039;] == &#039;image/png&#039;) { 
        //adresář kam bude probíhat upload obrázku 
        $adresar = &quot;upload/img/&quot;; 
        //název obrázku, jedná se o dočasný název, který je použit při přenosu obrázku 
        $nazev_souboru = $_FILES[&#039;logo&#039;][&#039;tmp_name&#039;]; 
        //cíl, obrázek budem ukládat např. do upload/img/prvni.png 
        $cil = $adresar.$_FILES[&quot;logo&quot;][&#039;name&#039;]; 
        //občas se stane že server nastaví obrázku právat tak že s ním později nemůže manipulovat 
        //tato funkce zajistí správné nastavení přístupových práv 
        umask(0); 
        //samotný upload souboru, pokud dojde k chybě, zobrazíme uživateli hlášku 
        move_uploaded_file($nazev_souboru, $cil)or die(&quot;Přenášený obrázek nelze zkopírovat. 
            <a href="history.go(-1);">Zpět</a><br />"); 
        //zde můžeme nastavit nový název obrázku 
        $novy_nazev = $adresar.time().".jpg"; 
        //pomocí funkce rename provedeme změnu názvu 
        rename( $cil, $novy_nazev ); 
        //nakonec provedeme změnu práv na 777 
        chmod($novy_nazev, 0777); echo "Upload probělh úspěšně"; 
    }else{
        //kód který se provede pokud se nejedná o podporovaný typ obrázku 
        echo "Podporované typy obrázku jsou: JPG, GIF a PNG"; } } 
?&gt; 
<form action="#" enctype="multipart/form-data" method="post">
      
 
</form>

Různá vylepšení a upgrady nechám pouze a jen na vás. Například je ještě možné zakomponovat funkci pro vytvoření miniatury obrázku. Loučím se a těším se na shledání u dalšího článku.

O Petr Láslo

Student ČVUT FJFI katedry softwarového inženýrství v ekonomii. Mezi jeho zájmy patří programování a sport. Autor má zkušenosti s PHP 5, MySQL, XHTML a CSS. Zajímá se o platformu .NET, jazyk C#, ASP.NET a WPF.