20. Fejezet. Fájlfeltöltés kezelése

Tartalom
POST metódusú feltöltések
Hibaüzenetek magyarázatai
Tipikus csapdák
Több állomány egyidejű feltöltése
PUT metódusú feltöltések

POST metódusú feltöltések

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

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

Érdemes megemlíteni, hogy 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.

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:

Példa 20-1. Állományfeltöltő űrlap

<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Állpmány elküldése: <input name="userfile" type="file">
<input type="submit" value="OK">
</form>
Az _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.

Figyelem

A MAX_FILE_SIZE csak javasolt érték a böngészők számára. Könnyű megkerülni ezt a megadott maximumot. Ezért nem szabad csak arra építeni, hogy a böngésző úgy viselkedik, ahogy azt ebben a példában láttuk. A maximális feltöltési állományméretre vonatkozó PHP beállítások azonban nem kerülhetőek meg.

A feltöltött állományokra vonatkozó változók PHP verziótól függően különböznek egymástól. Az autoglobális $_FILES PHP 4.1.0 óta létezik, a $HTTP_POST_FILES tömb PHP 4.0.0 óta. Ezek a tömbök tartalmazzák az összes feltöltött állomány adatait. Az új verziókban már a $_FILES használata javasolt. Ha a register_globals PHP diretíva be van kapcsolva, akkor a vonatkozó változók a globális névtérben is létrejönnek, és mint globális változók használhatók. Figyelem: A register_globals alapértelmezés szerint biztonsági okokból ki van kapcsolva, PHP 4.2.0 verziójától kezdve.

A $_FILES tartalma a fenti példánk alapján a következő. Megjegyezzük, 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ó.

$_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. Az error elem PHP 4.2.0-tól használható.

Megjegyzés: A PHP 4.1.0 előtti verziókban $_FILES tömb helyett a $HTTP_POST_FILES-t kell használni, amely nem autoglobális változó, mint ahogy $_FILES. A PHP 3 nem biztosítja a $HTTP_POST_FILES változót sem.

Ha register_globals is turned on in php.ini, additional variables are available. For example, $userfile_name will equal $_FILES['userfile']['name'], $userfile_type will equal $_FILES['userfile']['type'], etc. Keep in mind that as of PHP 4.2.0, register_globals defaults to off. It's preferred to not rely on this directive.

Ha a register_globals be van kapcsolva a php.ini fájlban, akkor a következő változók jönnek létre. A $userfile_name megegyezik a $_FILES['userfile']['name'] elemével, $userfile_type a $_FILES['userfile']['type'] elemével, stb. Vedd figyelembe, hogy PHP 4.2.0 verziójától kezdve a register_globals alapértelmezés szerint ki vankapcsolva. Nem ajánlatos erre a direktívára hagyatkozni program írásakor.

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 20-2. Fájlfeltöltések ellenőrzése

Az alábbi példák a PHP 4.0.2-nél újabb verzióival működnek. Lásd az is_uploaded_file() és move_uploaded_file() függvényeket.

<?php
// A PHP 4.1.0 előtti verzióiban a $_FILES helyett a $HTTP_POST_FILES használandó
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    
copy($_FILES['userfile']['tmp_name'], "/a/feltoltott/file/uj/helye");
} else {
    echo
"Lehetséges támadás. Fájlnév: " . $HTTP_POST_FILES['userfile']['name'];
}
/* ...vagy... */
move_uploaded_file($_FILES['userfile']['tmp_name'], "/a/feltoltott/file/uj/helye");
?>

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.

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.