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

Tartalom
POST metódusú feltöltések
Tipikus csapdák
Több fájl 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ügyeleted van afelett, hogy ki tölthet fel fájlt, és mi történik a feltöltött fájlokkal.

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

A fájl feltöltési lehetőség egy speciálisan kiképzett formmal biztosítható:

Példa 20-1. Fájlfeltöltő Űrlap

<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Fájl 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 fájl 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 PHP fogad.

Figyelem

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

A változók, amelyek egy sikeres feltöltés során létrejönnek a PHP változat és beállítás függvényében mások-mások lehetnek. A következő változók a feltöltés célprogramjában jönnek létre egy sikeres feltöltés során. Ha a track_vars beállítást engedélyezed, a $HTTP_POST_FILES és $_FILES tömbök jönnek létre. Végül a kapcsolódó változók létrejöhetnek globális változókként is, ha a register_globals beállítás be van kapcsolva. Ez azonban nem javasolt.

Megjegyzés: A track_vars beállítás mindig be van kapcsolva a PHP 4.0.3 vagy újabb veziókban. A PHP 4.1.0 vagy újabb változatokban a $_FILES tömböt is használhatod a $HTTP_POST_FILES helyett. A $_FILES mindig elérhető, ezért nem szabad a global kulcsszót használni a $_FILES változóra függvényekben.

A $HTTP_POST_FILES és a $_FILES változók használata javasolt a feltöltött állomány információk elérésére. A tömb tartalma itt következik. Ebben az esetben feltételezzük, hogy a fenti űrlapnak megfelelően a 'userfile' nevet adtad a feltöltési input mezőnek:

$HTTP_POST_FILES['userfile']['name']

Az eredeti fájlnév a kliensgépen.

$HTTP_POST_FILES['userfile']['type']

A fájl MIME típusa, ha a böngésző megadta ezt az információt. Például egy gif kép esetében: "image/gif".

$HTTP_POST_FILES['userfile']['size']

A feltöltött fájl mérete, byte-ban megadva.

$HTTP_POST_FILES['userfile']['tmp_name']

Az ideiglenes fájl elérési útja, ahol a feltöltött fájl tárolásra került a szerveren.

Megjegyzés: A PHP 4.1.0 és újabb verziók a rövidebb nevű $_FILES változót is biztosítják. A PHP 3 nem biztosítja a $HTTP_POST_FILES változót.

Ha a register_globals be van kapcsolva a php.ini fájlban, a következő változók jönnek létre. Ebben az esetben is feltételezzük, hogy a fenti űrlapnak megfelelően a 'userfile' nevet adtad a feltöltési input mezőnek:

Figyeld meg, hogy a "$userfile" előtag minden fenti változóban az űrlapban megadott érték, amit a type="file" sornál megadott <input> elem neveként határoztál meg. A fenti kérdőívben ezt "userfile"-nak választottuk.

Megjegyzés: A register_globals = On beállítás nem ajánlott biztonsági és teljesítmény okok miatt.

A fájlok 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. Egy PHP szkriptből a putenv()-el való átállítása nem fog menni. Ez a környezeti változó arra is használható, hogy ellenőrizd, hogy más műveletek is végezhetőek-e a feltöltött fájlokon.

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 vagy későbbi verzióiban a $_FILES
// használandó a $HTTP_POST_FILES helyett
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {
    copy($HTTP_POST_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($HTTP_POST_FILES['userfile']['tmp_name'], "/a/feltoltott/file/uj/helye"); 
?>

A PHP program, ami megkapja a feltöltött fájlt, gondoskodik arról is, hogy a kívánt műveleteket elvégezze a fájlal. Például törölheti a fájlt, ha az túl nagy, vagy túl kicsi, figyelembe véve a $HTTP_POST_FILES['userfile']['size'] változót, vagy meghatározhatja a $HTTP_POST_FILES['userfile']['type'] alapján, hogy ez a fájl megfelel-e egy meghatározott fájltípusnak, és ha nem, törölheti. Bármi is a cél a feltöltött fájlal, 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 fájlt.

A fájl törlésre kerül az ideiglenes könyvtárból a kérés végrehajtásának végeztével, ha nem mozgatod el, vagy nem nevezed át.