Jednoduchý upload souboru na server pomocí PHP

16. srpna 2001

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.

Mohlo by vás také zajímat

Nejnovější

8 komentářů

  1. Lukáš

    Led 13, 2010 v 12:03

    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

    Odpovědět
  2. Adam

    Led 13, 2010 v 21:29

    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)

    Odpovědět
  3. Jirka

    Led 25, 2010 v 7:07

    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.

    Odpovědět
  4. Anne

    Led 28, 2010 v 16:26

    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?

    Odpovědět
  5. Saphire

    Led 31, 2010 v 19:12

    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
  6. lukas

    Kvě 23, 2010 v 17:49

    ked dam upload vypise mi v upload.php – undefined variable: akce in c:\wamp…\upload.php on line 15 . co s tym?

    Odpovědět
  7. Dzejk

    Kvě 23, 2010 v 20:07

    Saphire: jaka prasecina? Vzdyt je to clanek z roku 2001, kdy se pouzivalo uplne jine PHP nez dnes.

    Odpovědět
  8. ab

    Bře 20, 2012 v 15:56

    totok je kotel starej script , uz 11 let, je mozny, ze uz neni funkcni….

    Odpovědět

Napsat komentář: Dzejk Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *