Jednoduchý upload souboru na server pomocí PHP

    8

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