Někteří z vás si psali o článek pojednávajícím o uploadu souboru na server. V dnešním článku vám popíšu jednoduchý upload souboru do vybraného adresáře, bez použití databáze. Úspěšný upload bude doprovázen posláním informačního e-mailu na adresu správce serveru.

Úvodní formulář

Nejprve vám představím kód jednoduchého formuláře, jehož prostřednictvím se bude upload souboru na server realizovat.

<FORM ACTION=“upload.php“ METHOD=“post“ ENCTYPE=“multipart/form-data“>
<INPUT TYPE=“file“ NAME=“soubor“ SIZE=“30″>
<INPUT TYPE=“submit“ NAME=“akce“ VALUE=“Upload“>
</FORM>

Nyní uvedu pár komentářů k uvedenému formuláři. Oproti běžným formulářům jsou zde nějaká rozšíření. Protože chci přenést soubor, zadefinoval jsem hodnotu atributu ENCTYPE na „multipart/form-data“. Standardní hodnotou, jak asi víte, je totiž „application/x-www-form-urlencoded“. Takové kódování je ale pro náš případ nepoužitelné. Pokud je použito kódování „multipart/form-data“ je nutné použít pro přenost metodu POST. Pro zadání názvu souboru je vstupní pole typu „file“, které umožní uživateli soubor také vybrat z klasického okna pro výběr souboru.

Zpracování formuláře

Po stisknutí tlačítko „Upload“ je zavolán skript upload.php, který nyní zpracuje požadavek. Uploadnutý soubor je dočasně přístupný přes proměnnou $soubor, resp. skrze několik proměnných, které mají řetězec „soubor“ uveden jako prefix. Jsou to:

  • $soubor – obsahuje jméno dočasného souboru, do kterého nám php skript soubor uložil
  • $soubor_type – obsahuje MIME typ souboru
  • $soubor_size – velikost uploadnutého souboru v bajtech
  • $soubor_name – původní název souboru na uživatelském počítači

Nyní uvedu zdrojový soubor jednoduchého skriptu upload.php, který pak následně blíže popíšu.

<HTML>
<HEAD><TITLE>Upload</TITLE></HEAD>
<BODY>
<?
if ($akce == „Upload“) {
  if ($soubor_type == „text/plain“ or $soubor_type=“text/html“) {
    if (copy ($soubor, „data/$soubor_name“)) {
      print „Soubor $soubor_name o velikosti $soubor_size bajtů
       byl úspěšně uploadnut na server<BR>“;

      mail („spravce@muj_server.cz“, „Upload souboru $soubor_name“,
       „Na server byl nahrán soubor /data/$soubor_name\n“,
       „From: system@muj_server.cz\nX-web: http://www.muj_server.cz/system/upload.php“);
    }
    else {
      print „Při nahrávání souboru došlo k chybě!<BR>“;
    }
  }
  else {
    print „Soubor není požadového MIME typu!<BR>“;
  }
}
?>
<HR SIZE=“1″ NOSHADE>
Zadejte jméno souboru:
<FORM ACTION=“upload.php“ METHOD=“post“ ENCTYPE=“multipart/form-data“>
<INPUT TYPE=“file“ NAME=“soubor“ SIZE=“30″>
<INPUT TYPE=“submit“ NAME=“akce“ VALUE=“Upload“>
</FORM>
</BODY>
</HTML>

Popis skriptu

Spodní část je jasná, ta zobrazí formulář pro upload souboru. V první části skriptu je nejdříve dotaz, zdali bylo stisknuto tlačítko „Upload“ a pokud ano, provede se kontrola, zdali zadaný soubor je požadovaného MIME typu. Jestliže ano, pak se provede zkopírování souboru do vyhrazeného adresáře data/, pod takovým názvem, jaký byl u uživatele. Pokud kopírování proběhne úspěšně, vypíše se informační hláška na obrazovku prohlížeče a po té se pomocí funkce mail pošle e-mail na adresu správce serveru, že byl uploadován nový soubor.

Funkce mail funguje jen v případě, že je správně nastaven server. Nastavení lze provést v souboru php.ini (direktivy SMTP a sendmail_from). V případě, že soubor nebude mít odpovídající MIME typ, vypíše se hláška a soubor na server uploadován nebude.

Skript si můžete stáhnout zde. Otestován byl na IIS 5.0 a PHP 4.0.6. Ve skriptu v argumentech funkce mail si musíte samozřejmě nastavit vlastní server a svou e-mailovou adresu.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

8 Příspěvků v diskuzi

  1. použil sem váš skript na upload ale nejede mi vypadá to že nemám správný typ souboru označen u vás jako MIME. jak jej mám upravyt pro obrázky *.JPG

  2. 2Lukáš:
    do druhe podminky pridejte MIME typ pozadovanych souboru
    or $soubor_type==“image/jpeg“ or $soubor_type=“image/pjpeg“ or $soubor_type=“image/jpg“

    pripadne muzete i image/gif, image/png atd :o)

  3. Zkoušel jsem skript použít, ale soubor se nevytvoří (přístupová práva OK), ani se neobjeví žádné hlášení, po kliknutí na tlačítko se zobrazí stejný prázdný formulář jako na začátku.

  4. Adam:
    Zdravím, mám zřejmě tentýž problém co dotyčný Lukáš, ale nevím do jaké druhé podmínky přidat MIME?

  5. To není řešení, Tohle je prasečina!
    Nezlobte se na mě, ale je to napsané v register globals -on a na přenos souboru semísto move_uploaded_file(„tmp_name“,“cíl“) použitá ne dvakrát bezpečná f-ce copy()

Odpovědět