Upload souborů na HTTP server

Klíčová slova: Upload, PHP, MAX_FILE_SIZE
Rubrika: PHP

Následující dva skripty vám pomohou při řešení věčného problému uploadu souborů na stranu serveru. První z nich upload_form.php je formulář který slouží pro výběr souboru. Najdete vněm také skrytý parametr „MAX_FILE_SIZE“ který určuje maximální velikost přenášeného souboru. V našem případě jsme nastavili tento parametr zhruba 50k. Znamená to že se budou přenášet soubory pouze do velikosti max. 50k.

upload_form.php :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>www.provaz.cz/sector02 - Test Upload 01</title>
</head>
<body>
  <form enctype="multipart/form-data" action="upload.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="50000">
    Vložit obrázek: <input name="userfile" type="file" >
    <input name="submit" type="submit" value="Send File">
  </form>
</body>
</html>

Pokud přenášený soubor odpovídá zadané velikosti a pokud není transakce nějak přerušena, zadaný soubor se přenese do TMP adresáře, pod TMP-Názvem, na stranu serveru. Druhý skript upload.php vám přiblíží jak zjistit parametry předaného souboru. Poradí vám také jak zajistit přenos pouze určitého typu souboru. V našem příkladu jsme se zaměřili na přenos obrázku GIF.

upload.php :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>www.provaz.cz/sector02 - Test Upload 02</title>
</head>
<body>
<?php
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name']))
{
  //--- kontrola na typ souboru ---
  if ($HTTP_POST_FILES['userfile']['type']<>"image/gif")
  {
    echo "Nepodporovaný formát souboru:".$HTTP_POST_FILES['userfile']['type'];
    exit;
  }
  else
  {
    echo "Typ : OK<br>";
    echo "Name: ".$HTTP_POST_FILES['userfile']['name']."<br> ";
    echo "TMPName: ".$HTTP_POST_FILES['userfile']['tmp_name']."<br> ";
    echo "Type: ".$HTTP_POST_FILES['userfile']['type']."<br> ";
    echo "Size: ".$HTTP_POST_FILES['userfile']['size']."<br> ";
  }
 
  if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],
                                    $HTTP_POST_FILES['userfile']['name']))
  {
    echo 'OK';
  }
  else
  {
    echo "Error - Nemáte dostatečná přístupová práva";
  }
}
else
{
  echo "Soubor ".$HTTP_POST_FILES['userfile']['name']." je větší než 50kb";
}
?>
</body>
</html>

Výsledkem druhého skriptu je překopírování souboru z TMP adresáře na straně serveru do vašeho požadovaného cílového souboru. Nezapomeňte že je nutné mít v tomto adresáři nastavená příslušná práva! To je hlavní důvod proč nebude tento skript fungovat na některých freeware-serverech.

Oba skripty si můžete stáhnout na adrese http://www.provaz.cz/download_id.php?id=62

Autor: Jiří Provazník
Datum vydání: 19.10.2003 | Zobrazeno: 31381
Permanentní odkaz: Upload souborů na HTTP server

Komentáře (12)
V prvním skriptu si určitě překontrolujte, že je nastaveno enctype="multipart/form-data" a pak je důležité, zda váš server vůbec upload podporuje. Tento skript používám už dlouho a celkem úspěšně.
Autor:provaz
Dobrý den. při snaze odeslat hlášení webu se toto hlášení nedá odeslat za pomoci vašeho formuláře proto si jej můžete stáhnout z http://www.gt-racing.cz/odpoved.txt Za vaši odpověď děkuji ketez67
Autor:ketez67
Z hlášení jasně vyplívá, že problém je jednoznačně na straně přístupových práv k souborům. Bohužel tohle bývá dost individuální záležitost dle konfigurace serveru. Několikrát jsem se s tím setkal a vždy jsem to nakonec byl nucen řešit z provozovatelem serveru. Jednou stačilo pomoci CHMOD nastavit práva na cílový adresář, jindy byl nutný zásah správce pro nastavení práv přímo v TMP adresáři na server. Radím vám proto jediné. Zkuste kontaktovat nějakou technickou podporu vaše hostingu a poradit se sní, jak příslušná práva nastavit. Znova upozorňuji, že na některých serverech (převážně tam kde je hostování zdarma) toto nastavení nechtějí povolovat.
Autor:provaznik
Děkuji za vaší rychlou odpověď doménu mám placenou a proto budu kontaktovat technickou podporu. Ještě jednou děkuji ketez67
Autor:ketez67
Dobrý den omlouvám se že zase prudím ale psal jsem na tech.podporu a přišla mi odpověď ze které nejsem vůbec moudrý a při dotazu o bližší vysvětlení už jsem žádnou odpověď nedostal. Tady je text odpovědi: problems pravy budto prevod na safe mode off nebo davat umask pri uploadu. Já osobně nejsem žádný odborník v php ale snažím se náš web nějakým způsobem vylepšovat a tohle by nám v celku pomohlo kdy to fungovalo. Děkuji za odpověď případně za radu.
Autor:ketez67
Tak jsem se podíval co je to umask a asi by to bylo dobré do scritu ho vložit a pokud jsem to dobře pochopil tak nám by vyhovovalo umask=055.Ale nevím kam by měl ve scriptu přijít tak aby to fungovalo.
Autor:ketez67

Ještě vyzkoušejte následující změnu ve volání move_uploaded_file. Změnte kód třeba následujícím způsobem …. if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],$path_to.$file_to)) …. Proměnnou $path_to nastavte na nějaký adresář kde nastavíte pomocí FTP klienta úplná práva (CHMOD 777) . a proměnnou $file_to nastavte třeba na původní hodnotu názvu souboru ($file_to = $HTTP_POST_FILES['userfile']['name']). Hlavní finta je v nastavení práv na ten adresář uvedený v proměnné $path_to.

Jinak příkaz umask jsem prozatím používal jen u vytváření adresářů a emám sním moc zkušeností. Použil bych jej přímo před funkcí move_uploaded_file. Jestli to dobře chápu, měl by příkaz umask() ovlivnit jeden následující příkaz.

Jinak řeknu Vám, takového správce serveru bych hned vyměnil, nebo alespoň řádně provětral :- ).


Autor:Provaznik
Dobrý den Děkuji vaše úprava funguje perfektně. Ale snažím se o rozšíření možností uploadu i jiných formátu a pořád se mi nedaří to provést.Protože jsem v php naprostá lama mám k ruce knížky ze kterých se snažím něco pochopit ale i přesto se nemůžu pohnout z místa a to jsem nad tím seděl do 3 do rána.Pokud budete mít čas a chuť mi poradit tak se můžete podívat co jsem stvořil a co je v tom špatně.http://www.nateraci-maliri.cz/pokusy/upload.txt Za ochotu předem děkuji ketez67.
Autor:ketez67
Pro upload více formátu bych pouzil asi následující syntaxi
$accept_file = array("image/gif","image/pjpeg");
if ($HTTP_POST_FILES['userfile']['type']!in_array($accept_file)) { ....
Pak už je všechno stejné
Autor:Provaznik
Dobrý den věřím že jsem už otravný ale hází mi to hlášení při zápisu if ($HTTP_POST_FILES[\'userfile\'][\'type\']!in_array($accept_file)) ...Parse error: syntax error, unexpected \'!\' in /home/www/gt-racing.cz/subdomains/www/upload/upload.php on line 16..... pokud v zápise je if ($HTTP_POST_FILES[\'userfile\'][\'type\']<>!in_array($accept_file)) tak to sice uploadne ale hlášení je následovné .....Warning: Wrong parameter count for in_array() in /home/www/gt-racing.cz/subdomains/www/upload/upload.php on line 16..... opět děkuji předem za vaši radu a achotu mi stím pomoci.
Autor:ketez67
Dobrý den tak se mi to podařilo díky vám vyřešit možná krkolomně ale funguje. $accept_file = array (array(/"image/gif/",/"image/pjpeg/")); if ($HTTP_POST_FILES[/'userfile/'][/'type/']<>(in_array(array(/"image/gif/",/"image/pjpeg/"),$accept_file))) děkuji.
Autor:ketez67
Dobrý den, rád bych poprosil o radu. Nevím proč, ale při pokusu o upload souboru mi server odmítá akceptovat soubory jiného formátu než gif. Nevím o žádném omezení v php.ini, ale ani nikde na serveru. Když provedu upload souboru formátu gif $_files se inicializuje, v případě jiného formátu nikoliv. Přenos obsahu proměnných z formuláře probíhá normálně (viz. 'jmeno_souboru' ). Možná se ptám hloupě, ale jsem začátečník a fakt už nevím. Děkuji za radu. Přidávám kousek kódu.

Autor:Tomas
Přidej vlastní komentář:
Následující (běžně neviditelná) pole slouží pro vnitřní identifikaci systému. Pokud je vyplníte nebude možné váš požadavek na straně serveru zpracovat:
URL:
contents:
Website:
Pro odeslání vašeho komentáře použijte tlačítko "Odeslat". Toto tlačítko nepoužívejte:

Následující položky je vhodné vyplnit:
Jméno :
Email :
Web :
Místo :
Hodnocení:
Hodnocení jako pomocí hvězdiček
1/5= nejhorší, 5/5=nejlepší