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.

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