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:
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ó.
Az állomány eredeti neve a távoli kliensgépen.
A feltöltött állomány MIME típusa, ha a böngésző átadta ezt az információt, pl.: "image/gif".
A feltöltött állomány mérete bájtokban.
Annak az ideiglenes állománynak a neve, amely a szerveren tárolja a feltöltött állomány tartalmát.
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.
|
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.