Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

Egy kép vagy bármilyen más fájl szerverre feltöltésére szolgáló rendszer létrehozásához egy HTML űrlapot és egy PHP szkriptet használnak az űrlap által küldött adatok feldolgozására. Ily módon valósul meg számos olyan szolgáltatás, amely támogatja a fájlok feltöltését a szerverre. A szerverre való adatküldés szokásos formájához hasonlóan valósul meg.

HTML fájl benyújtási űrlap

A fájlfeltöltés legegyszerűbb formája:





Ennek eredményeként egy űrlapot kapunk, amely egy fájl kiválasztására szolgáló mezőt és egy gombot, amely űrlapadatokat küld a szervernek:

Paraméter entype ebben a formában kapja meg a multipart/form-data értéket, ami megadja, hogy a bináris adatok ebben a formában lesznek elküldve, pl. fájlt. Ha ez az érték nincs megadva, akkor alapértelmezés szerint az űrlap szöveges információként kerül végrehajtásra.

Paraméter MAX_FILE_SIZE Az űrlapon megadott a maximális fájlméretet adja meg, bájtban. Alapértelmezés szerint ezt a méretet a szerver beállításai határozzák meg.

A letöltési fájl címke megadása tartalmaznia kell a "file" típust, és a PHP szkript további munkájához meg kell adni a "name" értéket.

Az űrlapadatok küldését a címke végzi "beküldés" típussal. Normál gombként jelenik meg.

PHP fájl mentési kód

Ennek a kezelőnek az a feladata, hogy miután megkapta az űrlapadatokat, ellenőrizze azokat lehetséges hibákat, helyezze át a szerver által kapott ideiglenes fájlt a kívánt helyre a megadott néven. Itt különféle szükséges műveleteket is végrehajthatnak - információkat írhatnak az adatbázisba, miniatűröket készíthetnek a képekről, menthetik a képeket szerzői jogok hozzáadásával és még sok más.

A fogadó kódban a fájladatokat a $_FILES szuperglobális tömb tartalmazza. Ennek megfelelően megtekintheti az űrlapról küldött fájlra vonatkozó információkat a $_FILES["saját_fájl"] mappában. Egy ilyen tömb a következő információkat tartalmazza:

Miután megkapta ezt az információt a szerveren, a fájlt egy állandó könyvtárba kell másolni, mert. az ideiglenes fájl automatikusan törlődik a szkript befejezésekor.

A másolást a copy() függvény végzi, melynek paraméterei a forrásfájl neve (ebben az esetben az ideiglenes fájl neve $_FILES["my_file"]["tmp_name"]) és a cél neve. fájlt.

Az eredmény a következő kód legyen:

// megadva a kiszolgálón lévő új fájl könyvtárát és nevét
$új_fájl = "/feltöltési_fájlok/" .$_FILES["feltölt fájl" ]["név" ];

// fájl másolás, fájl másolása
if (copy($_FILES["feltöltési fájl" ]["tmp_name" ], $új_fájl)) (
visszhang "Fájl feltöltve a szerverre";
} más(
visszhang "Hiba a fájl betöltésekor";
?>

A fájl másolását a kiszolgáló egy meglévő mappájába kell végezni, amely rendelkezik fájlok létrehozásának jogával.

Ebben a példában a fájl neve megegyezik az eredeti feltöltési fájléval. A való életben nagyon gyakran a név beállítása a saját igényei szerint történik, leggyakrabban a letöltés dátumával és időpontjával, ami biztosítja a fájlnév egyediségét. Ez lehetővé teszi, hogy a fájlok tárolását és feldolgozását egyetlen szabványra csökkentse. Természetesen itt van még néhány további feladat az eredeti név adatbázisban való tárolása, ha szükséges, vagy a letöltött fájl kiterjesztésének meghatározása. De ebben az esetben kevesebb probléma lesz a fájlnév kódolásával, és a fájl digitális nevéből is kényelmesen lehet alkönyvtárakat képezni a letöltött fájlok tárolására.

A copy() függvény visszatér igaz Ha a másolás sikeres volt, és Hamis, ha hiba történt a másolási folyamat során.

Ha a másolás sikeresen befejeződött, a szerverre feltöltött fájllal elvégezheti a szükséges műveleteket.

A JavaScript le van tiltva a böngészőjében. Engedélyezze a JavaScript használatát az oldal működéséhez!

Fájlok feltöltése a szerverre

Rövid kitérő a feltöltéshez

Mik azok a fájlok feltöltése, vagy miért nem működik
copy("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg")

Még akkor sem szabad elfelejteni, hogy a php kliens/szerver technológiát használ, még ha csak egy számítógép áll a rendelkezésére, amelyen a szerver és a munkaállomás is egyben van. A letölteni kívánt fájl általában a kliens gépén található, pl. felhasználó, az oldal hétköznapi látogatója. A cél a szerver. A fájlátviteli folyamat befejezéséhez a következő űrlapra van szükségünk:

Küldje el ezt a fájlt:

Ugyanakkor a művelet mezőben meg kell adni a php script URL-jét, amely később feldolgozza a feltöltött fájlokat. A MAX_FILE_SIZE rejtett mezőnek meg kell előznie a fájlkiválasztó mezőt, és tartalmaznia kell a maximális megengedett fájlméretet bájtban. Célja a fájl méretének ellenőrzése még azelőtt, hogy a fájl elküldésre kerülne a szerverre. Ez megkíméli a felhasználót a hosszú és eredménytelen fájlfeltöltéstől a szerverre és a felesleges forgalom generálásától, de nem szabad túlságosan támaszkodni erre a korlátozásra, mivel könnyen kikerülhető.

Mi történik, ha a felhasználó kiválaszt egy fájlt a meghajtóján, és rákattint a "Fájl küldése" gombra? A böngésző elküldi a fájlt a szerverre, ahol a php interpreter az ideiglenes könyvtárába helyezi, véletlenszerű nevet rendel, és végrehajtja a műveletmezőben megadott szkriptet.

Hogyan nézzen ki az upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["felhasználói fájl"]["tmp_name"], $feltöltési könyvtár. $_FILES["felhasználói fájl"]["név"])) ( print "A fájl érvényes és sikeresen feltöltve."; ) else ( nyomtatás "Van néhány hiba!";)

Szkript írásakor természetes kérdés merül fel: hogyan lehet információt szerezni a letöltött fájlról, és hogyan juthatunk el magához a fájlhoz. Ha PHP 4.1.0-s vagy újabb verziót használ, a legjobb, ha a $_FILES globális tömbre hivatkozik. Minden feltöltött fájlhoz tartalmaz egy hash tömböt a következő adatokkal:

  • $_FILES["felhasználói fájl"]["név"]- a fájl eredeti neve, például a felhasználó látta a fájl kiválasztásakor;
  • $_FILES["felhasználói fájl"]["típus"]- a fájl mime/típusa például lehet kép/gif; ez a mező akkor hasznos, ha felületet szeretne biztosítani a feltöltött fájlok letöltéséhez;
  • $_FILES["felhasználói fájl"]["méret"]- a feltöltött fájl mérete;
  • $_FILES["felhasználói fájl"]["tmp_name"]- a lemezen lévő ideiglenes fájl teljes elérési útja;
  • $_FILES["felhasználói fájl"]["hiba"]- A 4.2.0 verzió óta 0 hibakódot tartalmaz, ha a művelet sikeres volt.

A 4.1.0 alatti PHP-verziók esetén ennek a tömbnek a neve $HTTP_POST_FILES. Ne felejtsük el, hogy a $_FILES-től eltérően ez a tömb nem szuperglobális, és amikor például egy függvényből éri el, kifejezetten meg kell adnia a globális $HTTP_POST_FILES fájlt;

Ha a kiszolgáló beállításaiban register_globals=on, további változók jönnek létre a következő formátumban: $felhasználófájl_neve, $felhasználófájl_típusa, $felhasználói_fájl mérete.... A legjobb mód a feltöltött fájlokkal kapcsolatos információkhoz - használja a $_FILES tömböt.

A feltöltött fájlokkal való munkához a legjobb a beépített is_uploaded_file() és move_uploaded_file() függvények használata, amelyek ellenőrzik, hogy egy fájl fel lett-e töltve, és a megadott mappába helyezi. Részletesebb információk a kézikönyv oldalain találhatók. Nem szabad újra feltalálnia a kereket, és nem szabad ideiglenes fájlokkal dolgozni, másolni, törölni őket. Ezt már megtették előtted és érted.

Szerver hangolás

Mindent jól csináltam, de valami nem működik nálam. Lehet, hogy a szerverem rosszul van beállítva?

Ha "mindent jól csinált", de a kódja nem működik, vagy nem működik megfelelően, ne essen kétségbe. Lehet, hogy a probléma nem az Ön kezében van, hanem a rossz szerverbeállításokban. Itt található a fájlfeltöltéssel kapcsolatos irányelvek listája:

A php.ini fájlban:

  • Ha tudni szeretné, hol van a php.ini, futtassa
  • file_uploads- a fájlok letöltésének általános tiltása vagy engedélyezése. Az alapbeállítás Be.
  • feltöltési_maximális_fájlméret- a maximálisan feltölthető fájlméret. Ha nagy fájlokkal kell dolgoznia, módosítsa ezt a beállítást. Az alapértelmezett 2M. Ne felejtse el módosítani a post_max_size-t.
  • post_max_size- a POST kérésben továbbított adatok méretének általános felső határa. Ha nagy fájlokkal kell dolgoznia, vagy egyszerre több fájlt kell átvinnie, módosítsa ezt a beállítást. Az alapértelmezett érték 8M.
  • upload_tmp_dir- ideiglenes könyvtár a szerveren, ahová az összes feltöltött fájl el lesz helyezve. Ellenőrizze, hogy milyen jogok vannak ráállítva (ha ebben a szakaszban nehézségei vannak, lásd a cikk végén található magyarázatokat). Egy ilyen könyvtárnak léteznie kell, és annak a felhasználónak, aki alatt az Apache fut, írási jogosultsággal kell rendelkeznie ehhez a könyvtárhoz. Ha az open_basedir korlátozással dolgozik, akkor az ideiglenes könyvtárnak benne kell lennie. Nem kell aggódnia a nevek törlése vagy egyedisége miatt, a PHP megoldja ezt a problémát.

Fájlban httpd.conf:

  • Először is győződjön meg arról, hogy az Apache 1.3 webszervert használja ( legújabb verzió az írás idején - 1.3.27). Ha Apache 2.0-t használ, olvassa el a következő kivonatot a dokumentációból:

    Ne használja az Apache 2.0-t és a PHP-t éles környezetben sem Unix, sem Windows rendszeren.

  • Ha a „POST Method Not Allowed” üzenetet kapja, az azt jelenti, hogy valami hasonlót kell keresnie a következő direktívákhoz, és kulcsszó lehetővé teszi: Rendelés engedélyezése, tiltása Engedélyezés mindenkinek
  • Problémák a bináris fájlok feltöltésével - a klasszikus kérdés "miért törnek el a fájlok feltöltés közben". Íme egy megoldás, amelyet Dima Borodin (http://php.spb.ru) javasolt: Abban a könyvtárban, ahol a szkript található, hozzon létre egy .htaccess fájlt, amelybe ezt írjuk: CharsetDisable On A fájlba httpd.conf sorok hozzáadása: CharsetRecodeMultipartForms Ki

Egy kis magyarázat ehhez a recepthez: a fent leírt probléma, amikor a szerverre feltöltött archívumok nincsenek kicsomagolva, és nem jelennek meg a képek, az orosz Apache webszerver használatából fakadhat. A CharsetDisable direktíva letiltja a charset-processing modult, azaz. nem történik konvertálás az ebben a mappában található fájlok letöltésekor. A CharsetRecodeMultipartForms direktíva letiltja a POST metódussal küldött adatok újrakódolását a Content-Type: multipart/form-data fejléccel. Azok. Az ezzel a beállítással továbbított bináris adatok eredeti formájában megmaradnak, az oldal többi tartalma pedig az aktuális szerverbeállításoknak megfelelően átkódolásra kerül.

Ez azonban bonyodalmakat okozhat: készüljön fel arra, hogy bizonyos esetekben magának kell átkódolnia a lekérdezések szövegrészeit. A dokumentáció ezt írja róla:

Használja a CharsetRecodeMultipartForms direktívát, amelyet a PL23-ban vezettek be, de továbbra is kézzel kell átkódolnia a kérések szöveges részeit. Ehhez használhatja a más modulokban elérhető orosz Apache API-t vagy a mod_perl webhelyről elérhető orosz Apache Perl API-t.

Itt talál egy példát a kódolás észlelésére: http://tony2001.phpclub.net/detect_charset/detect.phps

Az orosz Apache legújabb dokumentációja a hivatalos honlapján található: http://apache.lexa.ru/.

Ne felejtse el, hogy a konfiguráció módosítása után újra kell indítania a webszervert.

Az Apache beállításai .htaccess használatával is konfigurálhatók:

php_value feltöltési_maximális_fájlméret 50M php_value post_max_size 50M

További jellemzők

Több fájl letöltése egyszerre

Példa több fájl feltöltési űrlapjára:

Küldje el ezeket a fájlokat:


És ne felejtse el nagyítani post_max_size ha sok fájl várható

Fájlok automatikus feltöltése a szerverre

Ne feledje, hogy a felhasználó lemezén lévő fájlok bizalmas információk, amelyekhez sem a JavaScript, sem a PHP a legcsekélyebb mértékben sem kapcsolódik. Amíg a felhasználó maga választja ki a fájlt a segítségével szó sincs semmiféle munkáról vele. És ezt ne felejtsd el adott mező bemenet, az érték attribútum írásvédett.

Fájlok tárolása mySQL adatbázisban

Ha letölthető fájlokat kíván tárolni egy adatbázisban, emlékeznie kell a következő pontokra:

  • BLOB típusú mezőt kell használni
  • Mielőtt behelyezné az adatbázisba, ne felejtse el alkalmazni a mysql_escape_string () karakterláncot
  • Egy fájl megjelenítésekor meg kell adni a tartalom/típus fejlécet

Ne feledje, hogy a HTML-kódot megjelenítő szkriptnek semmi köze ahhoz a szkripthez, amelynek meg kell jelenítenie a képet. Ennek két különböző alkalmazásnak kell lennie.

A képek adatbázisban való tárolása nem jó stílus. Sokkal kényelmesebb csak a képfájlok elérési útjait tárolni az adatbázisban.

Képtulajdonságok lekérése.

Ha azzal a feladattal kell szembenéznie, hogy ellenőrizze a kép típusát vagy méretét, mielőtt feltölti a fájlt a szerverre, akkor szüksége lesz a getimagesize() függvényre. A lemezen lévő fájl nevét veszi argumentumként, és egy tömböt ad vissza, amelynek első két eleme a szélesség és magasság, a harmadik pedig a kép típusa. Ha a megadott fájlból nem lehet kiolvasni a megfelelő képet, a függvény false értéket ad vissza.

Fájlok feltöltése orosz nyelvű névvel

A fájlok szerverre való feltöltésekor ellenőrizni kell az eredeti nevüket, hogy vannak-e „nem szabványos” karakterek (például orosz betűk). Ha vannak, ki kell cserélni. Az eredeti fájlnév a $_FILES["userfile"]["name"] változóban található. Az orosz nyelvű karakterlánc átírássá való átkódolása a PHP példákban található.

Letöltési állapot kijelző (folyamatsor)

Kérjük, vegye figyelembe, hogy amíg a fájl nincs teljesen betöltve, a PHP nem tud működni sem a fájlmérettel, sem a letöltés százalékos arányával. Csak akkor tud hozzáférni az információhoz, ha a fájl már a PHP szerveren van. Ha továbbra is feltétlenül meg kell valósítania ezt a funkciót, használjon Java kisalkalmazást.

Fájlengedélyek

Problémák az engedélyekkel a kiszolgálón (upload_tmp_dir)

Unix-szerű operációs rendszerekben minden mappának, fájlnak, hivatkozásnak megfelelő hozzáférési joga van. Úgy nézhetnek ki, mint a rwx-rw-r- vagy a 754-es szám.

Egy fájl vagy könyvtár elérhetősége a felhasználói azonosítótól és a hozzá tartozó csoport azonosítójától függ. A mód egészét három szekvenciában írják le, mindegyik három betűvel:

Tulajdonosi csoport Egyéb (u) (g) (o) rwx rwx rwx

Itt a tulajdonos, a csoporttagok és az összes többi felhasználó jogosult a fájl olvasására, írására és végrehajtására. Jogok – a következő betűk bármilyen értelmes kombinációja:

r Az olvasás joga. (4)
w Írási engedély. (2)
x Végrehajtási jog (keresés a könyvtárban). (1)

  • Állítsa be a címtár tulajdonosát arra a felhasználóra, akinek a jogosultságaival az apache fut. Ez megtalálható a httpd.conf fájlban vagy a kiszolgálón lévő folyamatok listájában. A könyvtár engedélyeinek 700-nak kell lenniük (rwx------).
  • Függetlenül attól, hogy kié a könyvtár, állítsa az engedélyeket 777-re (rwxrwxrwx).

    Példa a képek szerverre való feltöltésének megvalósítására.

    $max_image_width = 380; $max_image_height = 600; $max_image_size = 64 * 1024; $valid_types = array("gif","jpg", "png", "jpeg"); if (isset($_FILES["felhasználói fájl"])) (if (feltöltött_fájl($_FILES["felhasználói fájl"]["tmp_név"])) ( $fájlnév = $_FILES["felhasználói fájl"]["tmp_name"]; $ ext = substr($_FILES["felhasználói fájl"]["név"], 1 + strrpos($_FILES["felhasználói fájl"]["név"], ".")); if (fájlméret($fájlnév) > $max. képméret ) ( echo "Hiba: Fájlméret > 64K."; ) elseif (!in_array($ext, $valid_types)) ( echo "Hiba: Érvénytelen fájltípus."; ) else ( $size = GetImageSize($filename); if (($size) && ($size< $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Küldje el ezt a fájlt:
    "; }
  • Örülök, hogy látlak az oldalam oldalain. Ma a fájlok szerverre való feltöltésének megvalósításáról fogunk beszélni. A téma elég érdekes. sok kezdőt érdekel ez a kérdés.

    Fájlok feltöltése a szerverre PHP eszközei nagyban megkönnyíti a fotógaléria kitöltésével vagy a webhely oldalának szerkesztő segítségével történő megtervezésével kapcsolatos munkáját (pl. TinyMCE). Igényei szerint bármilyen típusú fájlt feltölthet a szerverre.

    Ahhoz, hogy egy fájlt feltölthessen a szerverre, létre kell hoznia egy űrlapot a fájlok feltöltéséhez. Alapvetően adott formában nem sokban különbözik a szöveges mezőket tartalmazó normál űrlapoktól, kivéve azt típus nem fog szöveg, A fájlt(mivel fájlokat töltünk fel), és az attribútum magához az űrlaphoz kerül hozzáadásra enctype="multipart/form data". Entype meghatározza, hogy a böngésző milyen kódolást alkalmaz az űrlapparaméterekre.

    PHP - Fájlok manuális feltöltése a szerverre

    Demo: Fájlok feltöltése a szerverre

    Töltsd fel fotóidat a szerverre

    Elkészítettük a fájl feltöltési űrlapot, itt az ideje, hogy írjunk egy egyszerű kezelőt a fájlok feltöltéséhez a szerverre. Azonnal meghatározzuk, hogy mi lesz csak betöltve grafikus fájlok típussal jpeg, png, gif. Miután meghatároztuk a szerverre feltöltendő fájlok típusát, magán a szerveren kell létrehoznunk egy mappát, ahol a fájljainkat tároljuk. Az én példámban ez a képmappa, ahová a fájljainkat helyezzük el.

    "Nem volt hiba, a fájl sikeresen feltöltve a szerverre. ", 1 => "A fogadott fájl mérete meghaladta a maximálisan megengedett méretet, amelyet a php.ini konfigurációs fájl upload_max_filesize direktívája állít be.", 2 => "A feltöltött fájl mérete meghaladta a HTML formában megadott MAX_FILE_SIZE értéket.", 3 => "A feltöltési fájl csak részben érkezett meg.", 4 => "A fájl nem lett feltöltve.", 6 => "A Temp mappa hiányzik. Hozzáadva a PHP 4.3.10-hez és a PHP 5.0.3-hoz."); //A feltöltendő fájltípusok meghatározása $fileTypes = array("jpg" => "image/jpeg", "png" => "image/png", "gif" => "image/gif"); //Ha megnyomja a feltöltés gombot if(isset($_POST["feltöltés"])) ( //Ellenőrizze, hogy az adatok üresek-e vagy sem if(!empty($_FILES)) ( //Hibák ellenőrzése if($ _FILES["fájlok" ]["hiba"] > 0) $err = $errFeltöltés[$_FILES["fájlok"]["hiba"]]; //Ellenőrizze a feltöltendő fájl típusát if(!in_array($_FILES[ "files"][" type"], $fileTypes)) $err = "Ez a fájltípus ".$_FILES["fájlok"]["típus"] ." nem alkalmas feltöltésre!"; //Ha nincs hiba, akkor töltsd fel a fájlt if(empty($err)) ( $type = pathinfo($_FILES["files"]["name"]); $name = $uploadDir." /". uniqid("files_") .".". $type["extension"]; move_uploaded_file($_FILES["fájlok"]["tmp_name"],$name); //POST paraméterek visszaállítása header("Hely : http://". $_SERVER["HTTP_HOST"] ."/less/uploads/uploads.php?name=". $name); exit; ) else echo implode("
    ", $err); ) ) //Üzenet sikeres fájlfeltöltésről a szerverre if(isset($_GET["név"])) echo "

    Fájl ".htmlentities($_GET["név"]) ." sikeresen feltöltve!

    "; //Képek kiadása a könyvtárból $imgDir = array_values(array_diff(scandir($uploadDir), array("..", ".")))); for($i = 0; $i< count($imgDir); $i++) { if($i % 2 == 0) echo "
    "."\n"; echo " "."\n"; ) echo "

    "."\n"; echo "http://".$_SERVER["HTTP_HOST"] ." "; ?>

    Miután megírtuk a kódot, ellenőriztük, hogy minden működik-e, egy kezdőnek szembesülhet a nagy fájlok feltöltésének problémája. Ehhez módosítania kell a beállításokat PHP.INI

    ; Az egyes szkriptek maximális végrehajtási ideje másodpercben max_execution_time = 3000 ; Az egyes szkriptek által egy adatkérelem elemzésével eltölthető maximális idő max_input_time = 400 ; A szkript által elfoglalható maximális memóriamennyiség (8 MB) memory_limit = 500M ; A PHP által elfogadott POST adatok maximális mérete. post_max_size = 500M ; A feltöltött fájlok maximális megengedett mérete. feltöltési_maximális_fájlméret = 200 millió

    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 fájlok megosztására szolgálnak különböző programok között stb.

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



    Így fog kinézni a fenti többrészes űrlap (megpróbálhatja használni a többrészes űrlapok eredményének megtekintéséhez, ha feltölt egy kis fájlt 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 fájl nevének megadására szolgáló mező, amelynek a szerveren kell lennie .

    Többrészes űrlapok kezelése

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

    Konfiguráció PHP fájl A php.ini három beállítással 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 protokollon 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 fut a webszerver operációs rendszer Linux, ú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 az upload_tmp_dir ideiglenes könyvtárba, a fájl nevét véletlenszerűen választja ki. Ezután négy változót hoz létre a $_FILES szuperglobális tömbben. Ez a tömb információkat tartalmaz a feltö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ő. Ha a register_globals konfigurációs direktíva a következőre van állítva tovább, a megfelelő nevű változók is deklarálásra kerülnek. A 4.2.0-s verzió óta 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 a feltöltési fájl név itt feltételezhető 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ájlnév, 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"]["típus"] - a fogadott fájl MIME-típusa (ha a böngésző meg tudja állapítani), például: kép/gif, kép/png, kép/jpeg, szöveg/html;
    • (így hívtuk a fájlfeltöltés mezőt) - tartalmazza a fájl nevét az ideiglenes könyvtárban, például: /tmp/phpV3b3qY;
    • $_FILES["feltölt fájl"]["hiba"] - Fájl feltöltésekor előforduló hibakód. Kulcs ["hiba"] PHP 4.2.0-ban lett hozzáadva. Megtalálhatja a megfelelő hibakódokat

    A szkript lejárta 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. Vagyis a szkript algoritmusa a fájlnak a szerverre feltöltéséhez a következő:

    Ha megnyomja a "Küldés" gombot, akkor 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 át kell másolnia a megnevezett fájlt $_FILES["feltölt fájl"]["tmp_name"] valamilyen könyvtárba (írási jogosultság szükséges ehhez a könyvtárhoz).

    A fájlt a függvény másolja másolat() :

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

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

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

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

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

    // Fájl másolása a /tmp mappából a feltöltések közé
    // A fájlnév ugyanaz lesz, mint a szervernek való elkü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 a dolgok sokkal bonyolultabbak – 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 hozzáférésünk a DocumentRoot könyvtárhoz (általában /var/www/html vagy /home/httpd/html). Jelentkezzen be a rendszerbe 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:

    // Hozza létre a feltöltési könyvtárat

    // Állítsa be az apache és csoportja tulajdonosnevét - az apache is:

    Chown apache:apache feltöltések

    // Mindenki írhat (777) + a ragadós bit beállítása (1):

    Chmod 1777 feltöltések

    A fájl mérete korlátozható, ha szükséges, szerkesztheti a .htaccess fájlt, és korlátozhatja a hozzáférést a feltöltési könyvtárhoz - adjon meg konkrét felhasználókat, akik hozzáférhetnek a könyvtárhoz, vagy IP-címeket.

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

    Mi írunk PHP szkript fájlok feltöltése a szerverre


    // 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ásolat($_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!

    "
    ; kijárat; )

    // Információk megjelenítése a feltö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ési fájl" ][ "típus"]. "

    " ;
    visszhang "

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

    " ;
    visszhang "

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

    " ;

    ?>

    Több fájl feltöltése megvalósítható például különféle név értékeket a bemeneti címkéhez.

    Lehetővé teszi továbbá az egyidejűleg letöltött fájlokról szóló információtömbbe rendezett információk automatikus beszerzését. A funkció megvalósításához ugyanazt a szintaxist használja a tömb HTML-űrlapból történő elküldéséhez, mint a többszörös kijelölő és jelölőnégyzet mezők esetén:


    Küldje el ezeket a fájlokat:






    Ilyen űrlap elküldése esetén a $_FILES["userfile"], $_FILES["userfile"]["name"] és $_FILES["userfile"]["size"] tömbök inicializálódnak (a ugyanúgy , mint a $HTTP_POST_FILES PHP 4.1.0 és újabb verziókhoz korai változatai). 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 a /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"] 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. Nehezebb a szükséges biztonsági szintet 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 további kérdései vannak, vagy valami nem világos, üdvözöljük oldalunkon

    A fájlok szerverre feltöltésére szolgáló alkalmazás egy HTML űrlap (upload.html) és az upload.php szkript a feldolgozására.

    Megjegyzés: A szekcióból töltheti le a fájlfeltöltő rendszer ipari verzióját a szerverre. A rendszer nem csak a fájl feltöltését teszi lehetővé a szerverre, hanem a méretének, hátterének stb.

    Űrlapkód (upload.html)

    Fájl feltöltési űrlap



    Űrlapfeldolgozó szkript kódja (upload.php)

    Fájlfeltöltés eredménye 1024 * 3 * 1024 ) ( visszhang (); kilépés; ) // Ellenőrizze, hogy a fájl betöltődött-e if(is_uploaded_file ($_FILES [ "fájlnév" ][ "tmp_név" ])) ( // Ha a fájl feltöltése sikeres volt, helyezze át // az ideiglenes könyvtárból a célba move_uploaded_file ($_FILES [ "fájlnév" ][ "tmp_név" ], "/fájl/elérési útja/" . $_FILES [ "fájlnév" ][ "név" ]); ) else ( echo( "Hiba a fájl betöltésekor"); } ?>

    Az űrlap entype attribútuma határozza meg, hogy a böngésző milyen kódolást alkalmaz az űrlapparaméterekre. Ahhoz, hogy a fájlok feltöltése a szerverre működjön, az entype attribútumot multipart/form-data értékre kell állítani. Alapértelmezés szerint ez az attribútum az application/x-www-form-urlencoded értékre van állítva.

    Az űrlap bemeneti elemének fájl típusúnak kell lennie.

    HTTP-kérés beérkezése után a feltöltött fájl tartalma egy ideiglenes fájlba kerül, amely a szerver alapértelmezett könyvtárában jön létre az ideiglenes fájlok számára, kivéve, ha a php.ini fájlban más könyvtár van megadva (upload_tmp_dir direktíva).

    A feltöltött fájl jellemzői a $_FILES kétdimenziós tömbön keresztül érhetők el.

    Az upload.php szkript feltölt egy fájlt a kiszolgálóra, és bemásolja a /path/to/file/ könyvtárba.

    Bizonyos esetekben korlátozni kell a szerverre feltölthető fájl méretét. Például, hogy csak legfeljebb 3 MB méretű fájlokat tölthessen fel a szerverre, a következő szkript a következő kódot tartalmazza:

    1024*3*1024) ( echo( "A fájl mérete több mint három megabájt"); kijárat; ) ... ?>

    A feltöltött fájl maximális mérete az upload_max_filesize direktívával is beállítható, amely alapértelmezés szerint 2 MB:

    feltöltési_maximális_fájlméret ) .. ?>

    Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
    OSSZA MEG: