Forum und email

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");
    }
}
?>