Fájlok feltöltése a szerverre PHP segítségével. Fájlok hatékony feltöltése PHP segítségével Hogyan töltsünk fel fájlokat a szerverre


Mi a közös az online fotóalbumban található, e-mailhez csatolt fényképekben vagy az online kötegelt feldolgozási alkalmazásba beküldött fájlokban? Mindegyiket fel kell tölteni a szerverre az interneten keresztül egy webböngészőből. Valójában a fájlfeltöltés számos webhely és webalkalmazás fontos funkciója, amelyet naponta használunk. Ebből a cikkből megtudhatja, hogyan adhat hozzá fájlfeltöltési támogatást webhelyéhez PHP használatával.

Követelmények a fájlok feltöltése előtt

A letöltött fájlok feldolgozása szabványos folyamat, de néhány apró dologra figyelnie kell, mielőtt elkezdi. Az első dolog, amit meg kell győződnie arról, hogy a PHP be van állítva, és lehetővé teszi a fájlok feltöltését. Ehhez ellenőrizze a file_uploads direktívát a php.ini-ben, és ha le van tiltva, akkor engedélyezze.

File_uploads = Be

A feltöltött fájlok először egy ideiglenes könyvtárba kerülnek (de ne aggódj... a PHP szkript később áthelyezheti a fájlokat egy megfelelőbb helyre). A forrás helye a rendszer alapértelmezett ideiglenes könyvtára. Másik könyvtárat is megadhat a php.ini fájl upload_tmp_dir direktívájával. Ettől függetlenül érdemes ellenőrizni, hogy a PHP folyamat megfelelő írási jogosultságokkal rendelkezik-e a használt könyvtártól függően.

Upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp

Miután megbizonyosodott arról, hogy a konfiguráció lehetővé teszi a szerver számára a feltöltött fájlok elfogadását, koncentrálhat a részletekre, és hozzáadhatja a HTML űrlapot. Rendkívül fontos, hogy az elem

a POST metódust használta, és az enctype attribútumot multipart/form-data értékre állította.

A fájl szerverre való feltöltésének szakaszai

Valószínűleg már el tudja képzelni, hogyan töltődnek fel a fájlok a szerverre, saját tapasztalatai és a fent említett követelmények alapján.

  • A látogató megtekint egy HTML-oldalt, amelynek űrlapja kifejezetten a fájlfeltöltés támogatására van írva;
  • Ezután megadja a letölteni kívánt fájlt, és rákattint a küldés gombra;
  • A böngésző kódolja a fájlt, és elküldi a POST kérés részeként;
  • A PHP megkapja a benyújtási űrlapot, dekódolja a fájlt, és egy ideiglenes helyen tárolja a szerveren;
  • Az űrlapüzenet feldolgozásáért felelős írott PHP-szkript megvizsgálja a fájlt, és valamilyen módon feldolgozza azt, gyakran áthelyezi ideiglenes helyéről egy állandó helyre, ahol a fájl tárolásra kerül.

A fájlfeltöltés támogatásához létre kell hoznia egy HTML űrlapot, amely megjelenik a felhasználó számára, és egy PHP szkriptet, amely gondoskodik a feltöltött fájlról a szerveren.

HTML űrlap hozzáadása a fájl feltöltéséhez

A HTML űrlapok olyan felületet biztosítanak, amelyen keresztül a felhasználó fájlfeltöltést kezdeményez. Emlékeztetni kell arra, hogy az elem A metódus attribútumát közzé kell tenni, az enctype attribútumot pedig multipart/form-data értékre kell állítani. Elem file egy mezőt biztosít a betöltendő fájl megadására. Mint minden más űrlapelemnek, itt is fontos megadni egy name attribútumot, hogy hivatkozhasson rá az űrlapot feldolgozó PHP szkriptben.

Így néz ki egy tipikus fájlfeltöltési űrlap elrendezése:


Érdemes megjegyezni, hogy a különböző böngészők eltérően jelenítik meg a fájlfeltöltési mezőt. Az IE, a Firefox és az Opera szövegdobozként jeleníti meg, mellette egy gombbal, amely a "Tallózás" vagy a "Kiválasztás" felirattal rendelkezik. A Safari úgy jeleníti meg, mint egy „Fájl kiválasztása” gombot. Általában véve ez nem probléma, mivel a felhasználók hozzászoktak ahhoz, ahogy a mező megjelenik a böngészőben, és tudják, hogyan kell használni. Néha azonban találkozhat olyan ügyféllel vagy tervezővel, aki hajthatatlanul ragaszkodik egy bizonyos módon bemutatni. A fájlmezőkre alkalmazható CSS ​​és JavaScript mennyisége rendkívül korlátozott a böngészők által támasztott biztonsági megfontolások miatt. A fájl beírása nehéz lehet. Ha nagyon fontos számodra a megjelenés, javaslom, hogy olvassa el valamelyik cikket "Peter-Paul Koch" input type="file".

Menj a szerverre és dolgozz a PHP-vel

A fájlletöltési információk a $_FILES többdimenziós tömb használatával érhetők el. Ennek a tömbnek saját szerkezete van, a HTML űrlap fájlmezőihez vannak hozzárendelve nevek, akárcsak a $_GET és $_POST használatakor. Ezután minden fájl tömbje a következő elemeket tartalmazza:

  • $_FILES["myFájl"]["név"] - az eredeti fájlnevet tárolja;
  • $_FILES["myFile"]["type"] - elmenti a fájl MIME típusát;
  • $_FILES["myFile"]["size"] - elmenti a fájl méretét (byte-ban);
  • $_FILES["myFile"]["tmp_name"] - tárolja az ideiglenes fájl nevét;
  • $_FILES["myFile"]["error"] – az átvitel eredményeként kapott hibakódot tárolja.

A move_uploaded_file() függvény segítségével áthelyezhetünk egy fájlt az ideiglenes könyvtárából egy állandó helyre. Az is jó gyakorlat, ha erre a célra a copy() és rename() helyett ezt használja, mivel további ellenőrzéseket végez annak biztosítására, hogy a fájlt valóban egy HTTP POST kérés töltse le.

Ha a fájlt a felhasználó által megadott eredeti néven menti, javasoljuk, hogy győződjön meg arról, hogy ez biztonságos-e. A fájlnév nem tartalmazhat olyan karaktereket, amelyek befolyásolhatják a cél elérési útját, például perjeleket. A fájlnévnek egyedinek kell lennie, hogy elkerülje az azonos nevű meglévők felülírását (ha az alkalmazás nem biztosítja ezt). Ezt úgy biztosíthatja, hogy minden karaktert aláhúzásjellel helyettesít, amely nem betű, majd hozzáad egy növekvő számot, ha már létezik ilyen nevű fájl.

Így néz ki egy fájlletöltés fogadása és feldolgozása PHP használatával:

Define("UPLOAD_DIR", "/srv/www/uploads/"); if (!empty($_FILES["saját fájl"])) ( $sajátfájl = $_FILES["saját fájl"]; if ($myFile["hiba"] !== UPLOAD_ERR_OK) ( echo "

Hiba történt.

"; kilépés; ) // biztonságos fájlnév biztosítása $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // do nem írja felül a meglévő fájlt $i = 0; $alkatrészek = elérési út ($név) while (fájl_létezik(UPLOAD_DIR . $name)) ( $i++; $name = $parts["fájlnév"] . "-" . $i ). ". " . $parts["extension"] ) // a fájl mentése az ideiglenes könyvtárból $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name) ( echo "); "; exit; ) // a megfelelő engedélyek beállítása az új fájlhoz chmod(UPLOAD_DIR . $name, 0644 )

Először megbizonyosodunk arról, hogy a PHP a fájl szerverre való feltöltése hiba nélkül ment. Ezután meghatározunk egy biztonságos fájlnevet, ahogy fentebb leírtam, majd áthelyezzük a fájlt a célkönyvtárba a move_uploaded_file() segítségével. Végül végrehajtunk egy chmod() hívást, hogy megbizonyosodjunk arról, hogy az új fájl rendelkezik a szükséges engedélyekkel.

Biztonsági kérdések

Az egyik, hogy ellenőrizze a feltöltendő fájl típusát, milyen legyen. A $_FILES["myFile"]["type"] értékére vagy a fájlnévkiterjesztésre hagyatkozni nem biztonságos, mivel mindkettő könnyen hamisítható. Inkább használja az exif_imagetype() függvényt a fájl tartalmának ellenőrzésére, és annak meghatározására, hogy az valójában GIF, JPEG vagy több más támogatott képformátum egyike. Ha az exif_imagetype() nem érhető el (a függvényhez engedélyezni kell az Exif kiterjesztést), használhatja a getimagesize() -t. A neki visszaadott tömb tartalmazza a képtípust, ha a rendszer felismeri.

// ellenőrizze a GIF, JPEG vagy PNG fájlt $fileType = exif_imagetype($_FILES["saját fájl"]["tmp_name"]); $allowed = tömb(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); if (!in_array($fileType, $allowed)) ( // fájltípus nem engedélyezett...

Nem képfájlok esetén az exec() segítségével meghívhatja a unix fájl segédprogramot. úgy határozza meg a fájl típusát, hogy a várt helyeken ismert bináris aláírásokat keres.

// ellenőrizze a PDF fájlt $mime = "application/pdf; charset=binary"; exec("file -bi " . $_FILES["saját fájl"]["tmp_name"], $out); if ($out != $mime) ( // a fájl nem PDF ...

Egy másik lépés, amelyet megtehet, az, hogy szigorúan korlátozza a POST-kérés teljes méretét és a feltölthető fájlok számát. Ehhez adja meg a megfelelő értéket az upload_max_size , post_max_size és max_file_uploads direktívákhoz a php.ini fájlban. Az upload_max_size direktíva határozza meg a fájl maximális feltöltési méretét. A feltöltési méret mellett korlátozhatja a teljes POST-kérés méretét a post_max_size direktívával. A max_file_uploads egy új direktíva (az 5.2.12-es verzióhoz hozzáadva), amely korlátozza a fájlfeltöltések számát. Ez a három irányelv segít megvédeni webhelyét azoktól a támadásoktól, amelyek nagy hálózati forgalmat vagy rendszerterhelést okozva megpróbálják megzavarni annak elérhetőségét.

Bejegyzés_maximális_mérete = 8 millió feltöltés_maximális mérete = 2 millió maximális_fájl_feltöltés = 20

A harmadik lépés, amelyet megtehet a kockázat minimalizálása érdekében, az, hogy átvizsgálja a letöltött fájlokat egy víruskeresővel. Ez létfontosságú a gyakori vírusok és rosszindulatú programok elleni védelem szempontjából, különösen akkor, ha webhelye fájlokat cserél különböző személyek között, például egy webes e-mail klienshez vagy egy (legális) fájlmegosztó webhelyhez csatolt fájlokat. Van egy PHP-bővítmény, amely hozzáférést biztosít a ClamAV-hoz, de természetesen meghívhatja a ClamAV parancssori segédprogramot ugyanúgy, ahogy a fájlnál bemutattam.

Exec("clamscan --stdout " . $_FILES["saját fájl"]["tmp_name"], $out, $return); if ($return) ( // fájl fertőzött...

Összegzés és következtetések levonása

Ma megtanulta, hogyan kell konfigurálni és megvalósítani a PHP-folyamatot, amellyel webhelyéről vagy webes alkalmazásáról fájlokat tölt fel a szerverre. A sikeres feltöltés érdekében a HTML űrlapot POST kéréssel kell beküldeni több adatformátummal, és a PHP-nek engedélyeznie kell a feltöltést a file_uploads direktíva szerint. A fájl átvitele után a feltöltés feldolgozásáért felelős szkript a $_FILES tömbben található információk alapján helyezi át a fájlt az ideiglenes könyvtárból a kívánt helyre. Megosztottam néhány további óvintézkedést is, amelyekkel megvédheti magát és felhasználóit a fájlok letöltésével kapcsolatos kockázatoktól. Biztonsága érdekében ellenőrizze a fájltípust, szabjon szigorú korlátozásokat a forgalom betöltésére, és használjon víruskeresést.

Azok számára, akiket érdekelhet, további kód érhető el ehhez a cikkhez a GitHubon. Böngészheti, letöltheti vagy klónozhatja a tárolót, és játszhat a kóddal, hogy jobban megértse a fájlfeltöltési folyamat működését.

Ha nem közvetlenül a webszerverről, hanem PHP-vel kellett fájlokat küldenie (például letöltési statisztikák gyűjtéséhez), kérjük, olvassa el a kat.

1. A readfile() használata

Az a jó ebben a módszerben, hogy a dobozból kivéve működik. Csak meg kell írnia a saját fájlküldési funkcióját (kissé módosított példa a hivatalos dokumentációból):

Függvény file_force_download($file) ( if (file_exists($file)) ( // állítsa vissza a PHP kimeneti puffert, hogy elkerülje a szkript számára lefoglalt memória túlcsordulását // ha ez nem történik meg, a fájl teljesen beolvasódik a memóriába! ha (ob_get_level()) ( ob_end_clean(); ) // kényszeríti a böngészőt a fájlmentési ablak fejlécének megjelenítésére("Tartalom-leírás: Fájlátvitel") " . basename($file)); header("Tartalom-átviteli kódolás: bináris"); header("Lejárat: 0"); header("Cache-Control: újra kell érvényesíteni"); header("Pragma: nyilvános "); header("Content-Length: " . filesize($file)); // olvassa be a fájlt és küldje el a felhasználónak readfile($file); exit; ) )
Még nagy fájlok is elküldhetők így, mivel a PHP beolvassa a fájlt és azonnal részenként adja át a felhasználónak. A dokumentáció egyértelműen kimondja, hogy a readfile() nem kellene memória problémákat okoz.

Sajátosságok:

  • A fájl beolvasásra kerül a readfile() függvény belső pufferébe, melynek mérete 8kB (köszönet 2fast4rabbit)

2. Olvassa el és küldje el a fájlt manuálisan

A módszer ugyanazt a Drupalt használja, amikor privát fájlrendszerből küld fájlokat (a fájlok nem érhetők el közvetlenül hivatkozásokon keresztül):

Függvény file_force_download($file) ( if (file_exists($file)) ( // állítsa vissza a PHP kimeneti puffert, hogy elkerülje a szkript számára lefoglalt memória túlcsordulását // ha ez nem történik meg, a fájl teljesen beolvasódik a memóriába! ha (ob_get_level()) ( ob_end_clean(); ) // kényszeríti a böngészőt a fájlmentési ablak fejlécének megjelenítésére("Tartalom-leírás: Fájlátvitel") " . basename($file)); header("Tartalom-átviteli kódolás: bináris"); header("Lejárat: 0"); header("Cache-Control: újra kell érvényesíteni"); header("Pragma: nyilvános "); header("Content-Length: " . filesize($file)); // olvassa be a fájlt és küldje el a felhasználónak if ($fd = fopen($file, "rb")) ( while (!feof ($ fd)) ( print fread($fd, 1024); ) fclose($fd);
Sajátosságok:

  • A szkript megvárja, amíg a teljes fájlt beolvassák és a felhasználónak átadják.
  • Lehetővé teszi a szervermemória megtakarítását

3. Használja a webszerver modult

3a. Apache
Az XSendFile modul lehetővé teszi, hogy egy speciális fejléc segítségével fájlt küldjön magának az Apache-nak. Vannak Unix és Windows verziók, a 2.0.*, 2.2.* és 2.4.* verziók alatt

A gazdagép beállításaiban engedélyeznie kell a fejléc elfogását a következő direktívával:
XSendFile bekapcsolva
Megadhat egy fehér listát is azoknak a könyvtáraknak, amelyekben a fájlok feldolgozhatók. Fontos: ha Windows-alapú kiszolgálóval rendelkezik, az elérési útnak tartalmaznia kell a meghajtó betűjelét nagybetűvel.

A lehetséges opciók leírása a fejlesztő honlapján: https://tn123.org/mod_xsendfile/

Példa fájl küldésére:

Függvény file_force_download($file) ( if (file_exists($file)) ( header("X-SendFile: " . realpath($file)); header("Content-Type: application/octet-stream"); ​​​​fejléc (" Content-Disposition: attachment; filename=" . basename($file) ) )

3b. Nginx
Az Nginx egy speciális fejlécen keresztül tud fájlokat küldeni a dobozból.

A helyes működés érdekében meg kell tagadnia a mappához való hozzáférést közvetlenül a konfigurációs fájlon keresztül:
hely /védett/ (belső; gyökér /some/path; )
Példa egy fájl küldésére (a fájlnak a /some/path/protected könyvtárban kell lennie):

Függvény file_force_download($file) ( if (file_exists($file)) ( header("X-Accel-Redirect: " . $file); header("Content-Type: application/octet-stream"); ​​​​header( "Content -Disposition: attachment; filename=" bázisnév($file) )
További információ a hivatalos dokumentációs oldalon

Sajátosságok:

  • A szkript azonnal véget ér az összes utasítás végrehajtása után
  • Fizikailag a fájlt maga a webszerver modul küldi el, nem a PHP
  • Minimális memória- és szervererőforrás-fogyasztás
  • Maximális teljesítmény

Frissítés: A Habrowser ilyaplot jó tanácsot ad, hogy jobb nem application/octet-stream , hanem a fájl valódi mime típusát küldeni. Így például a böngésző beillesztheti a szükséges programokat a fájlmentési párbeszédpanelbe.

Ez a funkció lehetővé teszi szöveges és bináris fájlok feltöltését is. A PHP engedélyezési és fájlkezelési funkcióival teljes mértékben szabályozhatja, hogy ki tölthet fel fájlokat, és mit kell tennie a feltöltés után.

A PHP bármely RFC-1867 kompatibilis böngészőből képes letöltött fájlokat fogadni.

Azt is érdemes megjegyezni, hogy a PHP támogatja a fájlfeltöltést a PUT metódus használatával, amelyet a Netscape Composer és a W3C Amaya kliensek használnak. A részletesebb dokumentációért lásd a PUT metódus támogatása című részt.

1. példa Űrlap fájlok feltöltéséhez

A fájl feltöltési oldal egy speciális űrlap segítségével valósítható meg, amely valahogy így néz ki:

Küldje el ezt a fájlt:

A fenti példában __URL__ PHP-szkriptre mutató hivatkozásra kell cserélni.

Rejtett mező MAX_FILE_SIZE(az értéket bájtban kell megadni) meg kell előznie a fájlkiválasztó mezőt, értéke pedig a PHP-ben elfogadott maximális fájlméret. Javasoljuk, hogy mindig ezt a változót használja, mivel ez megakadályozza, hogy a felhasználók nyugtalanul várjanak hatalmas fájlok átvitelekor, csak akkor derüljenek ki, hogy a fájl túl nagy, és az átvitel valóban meghiúsult. Ne feledje, hogy ezt a korlátozást meglehetősen könnyű megkerülni a böngésző oldalán, ezért nem szabad arra hagyatkoznia, hogy ez a funkció minden nagyobb fájlt blokkol. Ez többnyire kényelmi szolgáltatás az alkalmazás kliensoldalának felhasználói számára. A PHP-beállítások (a szerveren) a maximális méretre vonatkozóan azonban nem kikerülhetők.

Megjegyzés:

Győződjön meg arról is, hogy az űrlap attribútumait megadja enctype="multipart/form-data", ellenkező esetben a fájlok nem töltődnek fel a szerverre.

A fájl eredeti neve az ügyfél számítógépén.

$_FILES["felhasználói fájl"]["típus"]

MIME fájltípus, ha a böngésző ilyen információt adott. Példa: "kép/gif". Ezt a MIME típust a PHP nem ellenőrzi, ezért ne hagyatkozz az értékére ellenőrzés nélkül.

$_FILES["felhasználói fájl"]["méret"]

A fogadott fájl mérete bájtban.

Az ideiglenes név, amellyel a fogadott fájl a szerverre mentve lett.

$_FILES["felhasználói fájl"]["hiba"]

Fájl letöltése közben előforduló hibakód.

Alapértelmezés szerint a fogadott fájlok egy szabványos ideiglenes mappába kerülnek a kiszolgálóra, amíg a php.ini konfigurációs fájlban az upload_tmp_dir direktívával egy másik könyvtárat nem adnak meg. Az alapértelmezett szerverkönyvtár megváltoztatható a TMPDIR változó beállításával ahhoz a környezethez, amelyben a PHP fut. Ennek a változónak a beállítása a függvény segítségével putenv() nem működik PHP szkripten belül. Ez a környezeti változó arra is használható, hogy megbizonyosodjon arról, hogy más műveletek is működjenek az elfogadott fájlokon.

2. példa A szerverre feltöltött fájlok ellenőrzése

Részletesebb információkért olvassa el a funkciók leírását is_uploaded_file()És move_uploaded_file(). A következő példa egy űrlap segítségével feltöltött fájlt fogad el és dolgoz fel.

// PHP 4.1.0 és korábbi verziókban a $HTTP_POST_FILES fájlt kell használni
// $_FILES helyett.

$uploaddir = "/var/www/uploads/" ;
$uploadfile = $uploaddir . alapnév($_FILES["felhasználói fájl"]["név"]);

visszhang"

"
;
if (move_uploaded_file ($_FILES [ "userfile" ][ "tmp_name" ], $uploadfile )) (
visszhang "A fájl helyes, és sikeresen fel lett töltve.\n";
) más (
visszhang "Lehetséges fájlfeltöltési támadás!\n";
}

visszhang "Néhány hibakeresési információ:";
print_r($_FILES);

nyomtatni"

" ;

?>

A feltöltött fájlt fogadó PHP-szkriptnek meg kell valósítania a szükséges logikát annak meghatározásához, hogy mi a következő lépés a kapott fájllal. Például bejelölheti a $_FILES["userfile"]["size"] változót a túl nagy vagy túl kicsi fájlok kiszűréséhez. Használhatja a $_FILES["userfile"]["type"] változót is, hogy kizárja azokat a fájlokat, amelyek nem felelnek meg a fájltípus kritériumainak, azonban vegye figyelembe, hogy ezt a mezőt teljes mértékben a kliens vezérli, csak elsőként használja. egy sorozat ellenőrzése. A logika implementálásakor $_FILES["userfile"]["error"] és hibakódokat is használhat. Függetlenül attól, hogy melyik viselkedést választja, törölnie kell a fájlt az ideiglenes mappából, vagy át kell helyeznie egy másik könyvtárba.

Ha nem választott ki fájlt az űrlap elküldésekor, a PHP a $_FILES["userfile"]["size"] változót 0-ra, a $_FILES["userfile"]["tmp_name"] változót pedig üres karakterláncra állítja. egyik sem.

A szkript végén, ha a kapott fájlt nem nevezték át vagy nem helyezték át, akkor az automatikusan törlődik az ideiglenes mappából.

Többrészes formák

  • Levelezési szolgáltatások webes felületei, amelyek lehetővé teszik a levélhez csatolmány (csatolás) hozzáadását, és ehhez először fel kell tölteni a fájlt a szerverre, és csak ezt követően lehet hozzáadni a levélhez;
  • Interaktív fotógalériák és fotóalbumok, amelyek nem létezhetnek a fájlok szerverre való feltöltésének mechanizmusa nélkül;
  • Ingyenes szoftverportálok, amelyek különféle programok fájljainak cseréjére szolgálnak, stb.

A fájl feltöltése a szerverre egy többrészes űrlap segítségével történik, amelyen van egy fájl feltöltési mező. Az enctype paraméter a multipart/form-data értékre van állítva:



Így fog kinézni az adott többrészes űrlap (próbálkozhat vele, hogy megnézze a többrészes űrlapok eredményét egy kis fájl feltöltésével a szerverre):

A többrészes űrlapok általában a POST benyújtási módszert használják. Amint az az előző példából látható, ennek az űrlapnak két mezője van:

  • Fájlválasztó mező a feltöltéshez ;
  • A kiszolgálón lévő fájlnév megadására szolgáló mező .

Többrészes űrlapok feldolgozása

Mielőtt elkezdené írni a parancsfájlt egy többrészes űrlap feldolgozásához, szerkesztenie kell a konfigurációs fájlt php.ini hogy engedélyezze a fájlok feltöltését a szerverre.

A php.ini PHP konfigurációs fájl három paraméterrel rendelkezik a fájlok szerverre való feltöltéséhez:

  • file_uploads=Be - lehetővé teszi a fájlok feltöltését a szerverre HTTP-n keresztül;
  • upload_tmp_dir=/tmp - beállítja a könyvtárat a feltöltött fájlok ideiglenes tárolására;
  • upload_max_filesize=2M - beállítja a feltöltött fájlok maximális méretét.

Ha a webszerver Linux operációs rendszert futtat, akkor újra kell indítania a szolgáltatást:

szolgáltatás httpd újraindítás

Hogyan kezeli a PHP a többrészes űrlapokat? Miután megkapta a fájlt, elmenti egy ideiglenes könyvtárba, a neve upload_tmp_dir, véletlenszerűen kiválasztott fájlnévvel. Ezután négy szuperglobális tömbváltozót hoz létre $_FILES . Ez a tömb információkat tartalmaz a letöltött fájlról.

A feltöltött fájlokhoz definiált változók a PHP verziójától és az aktuális konfigurációtól függenek. A $_FILES szuperglobális tömb a PHP 4.1.0 óta elérhető. Abban az esetben, ha a register_globals konfigurációs direktíva a következőre van állítva tovább, további megfelelő nevű változók kerülnek deklarálásra. A 4.2.0-s verziótól kezdve a register_globals beállítás alapértelmezett értéke ki.

A példánkban szereplő $_FILES tömb tartalma alább látható. Ne feledje, hogy ez azt feltételezi, hogy a feltöltési fájl nevet használja a fájlkiválasztó mezőben, a fenti többrészes űrlap szerint. Természetesen a mező neve bármi lehet.

  • $_FILES["feltöltési fájl"]["név"] - a fájl neve, mielőtt elküldené a szervernek, például pict.gif;
  • $_FILES["uploadfile"]["size"] - a fogadott fájl mérete bájtokban;
  • $_FILES["feltölt fájl"]["type"] - a fogadott fájl MIME-típusa (ha a böngésző képes volt észlelni), például: kép/gif, kép/png, kép/jpeg, szöveg/html;
  • (ezt neveztük fájlfeltöltési mezőnek) - tartalmazza az ideiglenes könyvtárban lévő fájl nevét, például: /tmp/phpV3b3qY;
  • $_FILES["feltöltési fájl"]["hiba"] - Fájl letöltése közben előforduló hibakód. Kulcs ["hiba"] PHP 4.2.0-ban lett hozzáadva. Láthatja a megfelelő hibakódokat

A szkript befejezése után az ideiglenes fájl törlődik. Ez azt jelenti, hogy át kell másolnunk egy másik helyre, mielőtt a szkript befejeződik. Ez azt jelenti, hogy a szkriptnek az algoritmusa, amellyel fájlt tölt fel a szerverre, a következő:

Ha megnyomja a "Küldés" gombot, a fájl már fel van töltve a szerverre, és a neve a $_FILES["uploadfile"]["name"] változóban lesz. Ebben az esetben a szkriptnek azonnal másolnia kell egy nevű fájlt $_FILES["feltölt fájl"]["tmp_name"] valamilyen könyvtárba (ebbe a könyvtárba írási jogok szükségesek).

A fájl másolása a funkció segítségével történik másolat() :

Csak a copy() copy függvényt használja, a move függvényt ne, mert:

  • Az ideiglenes fájl automatikusan törlődik;
  • Ha az ideiglenes könyvtár más adathordozón van, hibaüzenet jelenik meg.

Tegyük fel, hogy fel kell töltenünk egy fájlt a feltöltések könyvtárába, amely a webszerver gyökérkönyvtárában található (a DocumentRoot könyvtárban).

// Minden esetre hozzunk létre egy könyvtárat. Ha már létrejött,
// nem fogunk hibaüzenetet látni, mert a @ operátort fogjuk használni:

@mkdir("feltöltések", 0777);

// Másolja a fájlt a /tmp-ből a feltöltések közé
// A fájlnév ugyanaz lesz, mint a szerverre küldés előtt:

Copy($_FILES["feltölt fájl"]["tmp_név"],"feltöltések/".basename($_FILES["feltölt fájl"]["név"]));

Linuxon minden sokkal bonyolultabb - figyelembe kell vennünk a feltöltési könyvtár engedélyeit. Ebben az esetben valószínűleg a függvény mkdir() nem fog működni, mert nincs írási jogosultságunk a DocumentRoot könyvtárba (általában /var/www/html vagy /home/httpd/html). Jelentkezzen be root felhasználóként, hozzon létre egy feltöltési könyvtárat, és módosítsa a tulajdonosát és az engedélyeit az alábbiak szerint:

// A feltöltési könyvtár létrehozása

// Állítsa be az apache tulajdonos nevét és csoportját - az apache-t is:

Chown apache:apache feltöltések

// Mindenki írjon (777) + állítsa be a ragadós bitet (1):

Chmod 1777 feltöltések

A fájl mérete korlátozható, ha kívánja, szerkesztheti a .htaccess fájlt, és korlátozhatja a hozzáférést a feltöltési könyvtárhoz – megadhatja a könyvtárhoz hozzáférő felhasználókat vagy IP-címeket.

Most már feltölthet fájlokat a szerverre.

PHP szkript írása a fájlok szerverre való feltöltéséhez


// Könyvtár, ahová a fájlt megkapjuk:
$uploaddir = "./files/" ;
$feltöltési fájl = $feltöltési könyvtár. alapnév($_FILES["feltölt fájl"]["név"]);

// Másolja ki a fájlt a könyvtárból a fájlok ideiglenes tárolására:
if (másolás ($ _FILES [ "feltöltési fájl" ][ "tmp_name" ], $feltöltési fájl ))
{
visszhang "

A fájl sikeresen feltöltve a szerverre

" ;
}
más (visszhang "

Hiba! Nem sikerült feltölteni a fájlt a szerverre!

"
; kilépés ; )

// Információk megjelenítése a letöltött fájlról:
visszhang "

Információk a szerverre feltöltött fájlról:

"
;
visszhang "

A feltöltött fájl eredeti neve: ".$ _FILES [ "feltöltési fájl" ][ "név" ]. "

" ;
visszhang "

A feltöltött fájl MIME típusa: ".$ _FILES [ "feltölt fájl" ][ "típus" ]. "

" ;
visszhang "

A feltöltött fájl mérete bájtban: ".$ _FILES [ "feltölt fájl" ][ "méret" ]. "

" ;
visszhang "

Ideiglenes fájlnév: ".$ _FILES [ "feltöltési fájl" ][ "tmp_name" ]. "

" ;

?>

Több fájl betöltése megvalósítható például a bemeneti címke különböző névértékeivel.

Lehetőség van arra is, hogy automatikusan tömbbe rendezett információkat szerezzünk be több egyidejűleg letöltött fájlról. A funkció megvalósításához ugyanazt a szintaxist használja a tömb HTML-űrlapról történő elküldéséhez, mint a több kijelölő és jelölőnégyzet mezők esetén:


Küldje el ezeket a fájlokat:






Ha ilyen űrlapot küldtek be, akkor a $_FILES["userfile"], $_FILES["userfile"]["name"] és $_FILES["userfile"]["size"] tömbök inicializálódnak (ugyanabban módon, például $HTTP_POST_FILES PHP 4.1.0 és korábbi verziókhoz). Ha a register_globals konfigurációs direktíva be van kapcsolva, akkor a kísérő globális változók is inicializálódnak. Ezen változók mindegyike a fogadott fájlok megfelelő értékeinek numerikusan indexelt tömbje lesz.

Tegyük fel, hogy a /home/test/some.html és /home/test/file.bin fájlokat betöltötte. Ebben az esetben a $_FILES["userfile"]["name"] változó értéke some.html , a $_FILES["userfile"]["name"] változóé pedig file.bin . Hasonlóképpen, a $_FILES["userfile"]["size"] változó tartalmazza a some.html fájl méretét és így tovább.

Változók $_FILES["userfile"]["name"] , $_FILES["felhasználói fájl"]["tmp_name"], $_FILES["felhasználói fájl"]["méret"] és $_FILES["felhasználói fájl"]["típus"] is inicializálva lesz.

Következtetés:

Mint látható, a fájlok szerverre való feltöltésének megszervezése nem olyan nehéz. A szükséges biztonsági szintet nehezebb biztosítani, mivel a fájlok szerverre feltöltését a támadók felhasználhatják a szerver megtámadására. A Feltöltésekkel végzett munka során a szükséges biztonsági szint biztosításával kapcsolatos információkért lásd:.



<<< Назад Tartalom Előre >>>
Ha bármilyen más kérdése van, vagy valami nem világos, üdvözöljük oldalunkon

Bizonyára gyakran különféle fájlokat töltött fel webhelyekre. Például, avatarokat töltött fel a fórumra, fényképek a közösségi oldalakon, különféle videók a videómegosztó oldalakon, csak fájlok a fájltároló szolgáltatásokon. És ebben a cikkben megtudhatja hogyan lehet fájlokat feltölteni a szerverre PHP-ben. Végig van PHP a legtöbb esetben ezt valósítják meg.

Az első dolog, amit meg kell értened, hogy te HTML űrlap, amelybe a fájl be van szúrva, ne legyen egészen hétköznapi, itt van egy példa HTML kód ez a forma:





A kulcspont itt az attribútum " enctype"jelentéssel" többrészes/forma-adatok Enélkül semmi sem fog működni.

", amelyben még nem fogjuk letölteni a fájlt, de egy kicsit végigmegyünk néhány fontos szemponton, amelyeket figyelembe kell venni, különben a biztonság sérülhet:

print_r($_FILES);
?>

Ennek eredményeként látni fogja a tartalmat globális kétdimenziós tömb $_FILES:

  • név- a letöltött fájl neve.
  • típus - MIME típusú letöltött fájl. Ez talán a legfontosabb paraméter a biztonság biztosításához. És mindig ellenőriznie kell a fájlok fogadásakor MIME típusú, különben nem lesz problémája. A következő cikkben erről részletesebben fogunk beszélni.
  • tmp_name- az ideiglenes fájl fizikai elérési útja. Erre a helyre kerül a fájl, és csak ezután helyezzük át egy másik helyre. Valójában a fájlt már letöltöttük, és csak át kell helyeznünk a szerver kívánt mappájába.
  • hiba- hibakód. Ha 0 , akkor nincsenek hibák.
  • méret- a letöltött fájl mérete. Ez is egy gyakran használt lehetőség, és azt is ellenőrizni kell, hogy korlátozza a feltöltött fájlok méretét. Ezt a méretet természetesen maga a szerver korlátozza, de mindenféle képhez egyértelműen túl nagy ez a méret (általában 10 MB).

És mindezek a paraméterek jelen vannak minden egyes betöltött fájlnál (melyek mindegyike egy tömb egy kétdimenziós tömbben $_FILES).

Most fejezzük be fájlok feltöltése a szerverre PHP-ben, és ehhez a következő kódot írjuk (""):

$uploadfile = "images/".$_FILES["valamilyen név"]["név"];
move_uploaded_file($_FILES["valamilyennév"]["tmp_név"], $feltölt fájl);
?>

Azaz először beállítjuk a letöltött fájl elérési útját a szerveren. Itt szeretnénk a fájlt a " könyvtárba helyezni képeket" ugyanazzal a névvel, mint a fájl korábban. És a funkció move_uploaded_file()áthelyezzük a fájlt az ideiglenes tárolójából a választott könyvtárba.

Felhívjuk figyelmét azonban, hogy ez nagyon fontos! Semmilyen körülmények között ne használja a kódot így, különben az Ön webhelye ezt fogja tenni Komoly veszély lesz! Valójában jelenleg bármit le lehet tölteni: bármilyen futtatható fájlt, szkriptet, HTML oldalakés más nagyon veszélyes dolgok. Ezért nagyon gondosan ellenőriznie kell a szerverre feltöltött fájlokat. És ezt fogjuk megtenni a következő cikkben. Mivel a téma nagyon fontos, azt tanácsolom, hogy iratkozzon fel a frissítésekre, hogy ne hagyja ki ezt a cikket.

 

Hasznos lehet elolvasni: