PHP kézikönyv
Előző |  | Következő

# 38. Fejezet. Fájlfeltöltés kezelése

# POST metódusú feltöltések

Ez a szolgáltatás egyaránt lehetővé teszi a látogatónak szöveges és bináris fájlok feltöltését. A PHP azonosítási és fájlkezelési képességeivel teljes felügyeletet lehet gyakorolni afelett, hogy ki tölthet fel állományokat, és azokkal mi történjen.

A PHP alkalmas fájl feltöltést fogadni bármilyen RFC-1867 kompatibilis böngészőtől (mint a Netscape Navigator 3 vagy későbbi és a Microsoft Internet Explorer 3 Microsoft javítással, vagy későbbi IE javítás nélkül).

> Kapcsolodó konfigurációs megjegyzés: Lásd még: file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size és a max_input_time direktívákat a `php.ini`-ben!

A PHP támogatja a PUT metódust is, amit a Netscape Composer és a W3C Amaya kliensek használnak. Lásd a PUT metódusú feltöltések részt.

Példa 38-1. Állományfeltöltő űrlap Az állomány feltöltési lehetőség egy különleges módon kialakított űrlappal biztosítható, amely nagyjából így néz ki:
    <!-- Az adatkódolás típusát meg kell adni az enctypeban, ahogy a példa is mutatja  -->
    <form enctype="multipart/form-data" action="_URL_" method="post">
     <!-- A MAX_FILE_SIZE meg kell előzze a fájlkiválasztó űrlapelemet -->
     <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
     <!-- A name-ben megadott név szerinti tömbelemben kapunk adatokat a $_FILES tömbben -->
     Állomány elküldése: <input name="userfile" type="file" />
     <input type="submit" value="OK" />
    </form>
A példában szereplő _URL_ a feldolgozást végző PHP fájlra kell, hogy mutasson. A MAX_FILE_SIZE rejtett mező a file típusú input mező előtt kell, hogy szerepeljen, és azt adja meg, hogy mekkora a maximális fájl méret (byte-okban megadva), amit a kliens jogosult feltölteni. Ez csak egy javasolt érték a böngészők számára, amit a PHP még szintén felülvizsgálhat. A böngésző oldalon ezt az értéket igen könnyű megnövelni, ezért céleszerű minden esetben a PHP-vel is a fájlok körmére nézni a méret tekintetében. Ellentétben az űrlapban beállítottal a PHP beállítása szerinti maximum méretet nem lehet semmi esetre sem túllépni semmilyen trükkel sem. Mindenesetre érdemes ezt a maximum értéket értéket az űrlapba helyezni, hogy az átlagfelhasználó ne várjon feleslegesen perceket arra hogy kiderüljön, túl nagy fájlt akar a szerverre tukmálni.

> Megjegyzés: Fontos, hogy a fájlfeltöltő űrlapokban szerepeljen a enctype="multipart/form-data" meghatározás is, ellenkező esetben a feltöltés nem fog működni.

A PHP 4.1.0-ás változata óta létezik a $_FILES globálisan elérhető tömb (korábbi változatokban használd a $HTTP_POST_FILES tömböt). Ez a tömb tartalmazza a feltöltött fájlok minden adatát.

A $_FILES tartalma a fenti példa alapján a következő. Megjegyezndő, hogy az alábbi felsorolás arra épít, hogy a az állomány feltölő mező neve userfile, ahogy a fenti példában látható. Ennek természetesen mi bármilyen más nevet is adhatunk.

$_FILES['userfile']['name']

  Az állomány eredeti neve a távoli kliensgépen.

$_FILES['userfile']['type']

  A feltöltött állomány MIME típusa, ha a böngésző átadta ezt az információt, pl.: "image/gif".

$_FILES['userfile']['size']

  A feltöltött állomány mérete bájtokban.

$_FILES['userfile']['tmp_name']

  Annak az ideiglenes állománynak a neve, amely a szerveren tárolja a feltöltött állomány tartalmát.

$_FILES['userfile']['error']

  Az állomány feltöltés során keletkezett hiba kódja. A PHP 4.2.0 változatától használható.

Az állományok alapbeállításban a szerver szokásos ideiglenes könyvtárában tárolódnak, ha nem adtál meg mást az upload_tmp_dir beállítással a `php.ini` fájlban. A szerver alapbeállítású könyvtára megváltoztatható a TMPDIR környezeti változóval abban a környezetben, ahol a PHP fut. PHP szkriptből a putenv()-el való átállítás nem működik. Ez a környezeti változó annak ellenőrzésére is használható, hogy más műveletek is végezhetőek-e a feltöltött állományokon.

Példa 38-2. Fájlfeltöltések ellenőrzése Érdemes még rátekinteni az is_uploaded_file() és a move_uploaded_file() függvényekre is. Az itt következő példa egy űrlap által kezdeményezett fájlfeltöltést fog lekezelni.
`<?php // A PHP 4.1.0 előtti verzióiban a $_FILES helyett a // $HTTP_POST_FILES használandó $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "A fájl megfelelő. sikeresen feltöltésre került.\n"; } else { echo "Lehetséges fájlfeltöltés-támadás!\n"; } echo 'Íme egy kis információ hibakereséshez:'; print_r($_FILES); echo '</pre>'; ?>`

A PHP programnak, amely megkapja a feltöltött állományt, gondoskodnia kell arról is, hogy a kívánt műveleteket elvégezze az állománnyal. Például törölheti azt, ha az túl nagy, vagy túl kicsi, figyelembe véve a $_FILES['userfile']['size'] változó értékét, vagy meghatározhatja a $_FILES['userfile']['type'] alapján, hogy ez a fájl megfelel-e egy meghatározott fájltípusnak, és ha nem, törölheti. PHP 4.2.0-től kezdve a $_FILES['userfile']['error'] használható arra, hogy a hibakódoknak megfelelően változzon szkript működését. Bármi is legyen a cél a feltöltött állománnyal, a PHP szkriptnek kell gondoskodnia arról, hogy elmozgassa egy biztonságos helyre, vagy törölje az ideiglenes könyvtárból az adott ideiglenes állományt.

Ha az űrlapban nem lett fájl kijelölve feltöltésre, a PHP a $_FILES['userfile']['size'] értékeként 0-át ad vissza, valamint a $_FILES['userfile']['tmp_name'] tartalma "none" lesz.

Az ideiglenes állomány törlésre kerül az ideiglenes könyvtárból a kérés végrehajtásának végeztével, ha nem lett elmozgatva vagy átnevezve.

Példa 38-3. Példa: Több fájl feltöltése egy tömbben A PHP támogatja a HTML adattömbök használatát fájl típusú űrlapelemek esetén is.
    <form action="" method="post" enctype="multipart/form-data">
    <p>Képek:
    <input type="file" name="kepek[]" />
    <input type="file" name="kepek[]" />
    <input type="file" name="kepek[]" />
    <input type="submit" value="Feltöltés" />
    </p>
    </form>
`<?php foreach ($_FILES["kepek"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["kepek"]["tmp_name"][$key]; $name = $_FILES["kepek"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>`

Előző | Tartalom | Következő
Dealing with XForms | Fel | Hibaüzenetek magyarázatai