Fájlfeltöltés kezelése
Table of Contents
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).
Note: 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.
Example#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.
Note: 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.
Example#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.
Example#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");
}
}
?>