Windows.  Vírusy.  Prenosné počítače.  internet.  Kancelária.  Verejné služby.  Vodiči

Na vytvorenie systému pre nahrávanie obrázka alebo akéhokoľvek iného súboru na server sa používa HTML formulár a PHP skript na spracovanie údajov odoslaných týmto formulárom. Týmto spôsobom sú implementované rôzne služby, ktoré podporujú nahrávanie súborov na server. Realizuje sa podobne ako bežná forma odosielania dát na server.

formulár na odoslanie súboru HTML

Najviac jednoduchá forma nahrávanie súboru:





Výsledkom je formulár obsahujúci pole na výber súboru a tlačidlo, ktoré odošle údaje formulára na server:

Parameter entype prijíma v tomto tvare hodnotu multipart/form-data, ktorá určuje, že v tejto podobe budú odosielané binárne dáta, t.j. súbor. Ak táto hodnota nie je zadaná, formulár predvolene odošle textové informácie.

Parameter MAX_FILE_SIZE, zadaný vo formulári určuje maximálnu veľkosť súboru, uvedenú v bajtoch. Štandardne je táto veľkosť určená nastaveniami servera.

Označenie značky stiahnutého súboru musí obsahovať typ "súbor", ako aj pre ďalšiu prácu PHP skript by mal špecifikovať hodnotu "name".

Odoslanie údajov formulára sa vykonáva pomocou značky s typom "odoslať". Zobrazuje sa bežným tlačidlom.

Kód na ukladanie súboru PHP

Úlohou tohto manipulátora je po prijatí údajov formulára ich skontrolovať možné chyby, presuňte dočasný súbor prijatý serverom na požadované miesto so zadaným názvom. Tu môžu vykonávať aj rôzne ďalšie potrebné operácie – zaznamenávanie informácií do databázy, vytváranie malých kópií obrázkov, ukladanie obrázkov s pridaním autorských práv a mnohé ďalšie.

V prijímacom kóde sú dáta súboru obsiahnuté v superglobálnom poli $_FILES. V súlade s tým môžete zobraziť informácie o súbore odoslanom z formulára v $_FILES["my_file"]. Takéto pole obsahuje nasledujúce informácie:

Po prijatí týchto informácií na server je potrebné súbor skopírovať do trvalého adresára, pretože Dočasný súbor sa po dokončení skriptu automaticky odstráni.

Kopírovanie vykonáva funkcia copy(), ktorej parametre sú názov zdrojového súboru (v tomto prípade názov dočasného súboru je $_FILES["my_file"]["tmp_name"]) a názov súboru cieľový súbor.

Výsledkom by mal byť nasledujúci kód:

// s uvedením adresára a názvu nového súboru na serveri
$new_file = "/upload_files/" .$_FILES["uploadfile" ]["name" ];

// skopírujte súbor
if (copy($_FILES["uploadfile" ]["tmp_name" ], $new_file)) (
ozvena "Súbor bol nahraný na server";
} inak(
ozvena "Chyba pri načítavaní súboru";
?>

Kopírovanie súboru sa musí vykonať do existujúceho priečinka na serveri s existujúcimi právami na vytváranie súborov v ňom.

V tomto príklade je názov súboru rovnaký ako pôvodný načítaný súbor. V skutočnosti sa názov veľmi často nastavuje podľa vlastných požiadaviek, najčastejšie pomocou dátumu a času stiahnutia, čím je zabezpečená jedinečnosť názvu súboru. To vám umožní zredukovať ukladanie a spracovanie súborov na jeden štandard. Tu sú, samozrejme, niektoré ďalšie úlohy, ako v prípade potreby uložiť pôvodný titul do databázy alebo určiť príponu sťahovaného súboru. Ale v tomto prípade bude menej problémov s kódovaním názvu súboru a digitálny názov súboru sa dá použiť na pohodlné vytváranie podadresárov na ukladanie stiahnutých súborov.

Funkcia copy() vráti pravda, ak bolo kopírovanie úspešné a False, ak sa počas procesu kopírovania vyskytla chyba.

Ak je kopírovanie úspešné, so súborom nahraným na server môžete vykonať všetky potrebné akcie.

JavaScript je vo vašom prehliadači zablokovaný. Povoľte JavaScript, aby stránka fungovala!

Nahrávanie súborov na server

Krátka exkurzia do nahrávania

Čo sú nahrávanie súborov alebo prečo to nefunguje?
kopírovať („c:\images\sample.jpg“, „http://mysite.ru/uploads/sample.jpg“)

Aj keď máte iba jeden počítač, ktorý kombinuje server aj pracovnú stanicu, nezabudnite, že php používa technológiu klient/server. Súbor, ktorý chceme stiahnuť, sa zvyčajne nachádza na počítači klienta, t.j. používateľ, bežný návštevník stránky. Cieľ je server. Na dokončenie procesu prenosu súboru potrebujeme nasledujúci formulár:

Odoslať tento súbor:

V tomto prípade musí pole akcie uvádzať URL vášho PHP skriptu, ktorý následne spracuje stiahnuté súbory. Skryté pole MAX_FILE_SIZE musí predchádzať poľu na výber súboru a musí obsahovať maximálnu povolenú veľkosť súboru v bajtoch. Jeho účelom je skontrolovať veľkosť súboru pred odoslaním súboru na server. Používateľa by to malo ušetriť od zdĺhavého a bezvýsledného nahrávania súboru na server a generovania zbytočnej prevádzky, ale na toto obmedzenie by ste sa nemali príliš spoliehať, pretože sa dá jednoducho obísť.

Čo sa stane, keď používateľ vyberie súbor na svojom disku a klikne na tlačidlo „Odoslať súbor“? Prehliadač odošle súbor na server, kde ho PHP interpret umiestni do svojho dočasného adresára, priradí mu náhodný názov a vykoná skript špecifikovaný v poli akcie.

Ako by mal vyzerať upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["name"])) (tlač "Súbor je platný a bol úspešne odovzdaný."; ) else (vytlačte "Vyskytli sa nejaké chyby!";)

Pri písaní skriptu vyvstáva prirodzená otázka: ako získať informácie o stiahnutom súbore a pristupovať k samotnému súboru. Ak používate PHP verziu 4.1.0 alebo staršiu, najlepším riešením je získať prístup do globálneho poľa $_FILES. Pre každý stiahnutý súbor obsahuje pole hash s nasledujúcimi údajmi:

  • $_FILES["userfile"]["name"]- pôvodný názov súboru, ako ho videl používateľ pri výbere súboru;
  • $_FILES["userfile"]["type"]- mime/typ súboru môže byť napríklad obrázok/gif; Toto pole je užitočné uložiť, ak chcete poskytnúť rozhranie na sťahovanie nahraných súborov;
  • $_FILES["userfile"]["veľkosť"]- veľkosť sťahovaného súboru;
  • $_FILES["userfile"]["tmp_name"] - plná cesta do dočasného súboru na disku;
  • $_FILES["userfile"]["error"]- Od verzie 4.2.0 obsahuje kód chyby, ktorý sa rovná 0, ak bola operácia úspešná.

Pre verzie PHP pod 4.1.0 sa toto pole nazýva $HTTP_POST_FILES. Nezabudnite, že na rozdiel od $_FILES toto pole nie je superglobálne a pri prístupe k nemu, napríklad z funkcie, musíte explicitne zadať globálne $HTTP_POST_FILES;

Ak sa v nastaveniach vášho servera register_globals=on vytvoria ďalšie premenné ako $userfile_name, $userfile_type, $userfile_size... Vzhľadom na to, že od verzie 4.2.0 je v predvolených nastaveniach register_globals=off použitie týchto premenných neodporúčajú, aj keď definovali. Najlepší spôsob na získanie informácií o stiahnutých súboroch použite pole $_FILES.

Na prácu s nahratými súbormi je najlepšie použiť vstavané funkcie is_uploaded_file() a move_uploaded_file(), ktoré skontrolujú, či bol súbor nahraný a podľa toho ho umiestnia do určeného priečinka. Viac podrobné informácie Nájdete ho na manuálových stránkach. Nemali by ste znovu vynájsť koleso a sami pracovať s dočasnými súbormi, kopírovať ich, mazať. Toto už bolo urobené pred vami a pre vás.

Nastavenie servera

Urobil som všetko správne, ale niečo mi nefunguje. Možno je môj server nesprávne nakonfigurovaný?

Ak ste „urobili všetko správne“, ale váš kód nefunguje alebo nefunguje správne, neponáhľajte sa do zúfalstva. Možno problém nie je vo vašich rukách, ale v nesprávnych nastaveniach servera. Tu je zoznam smerníc, ktoré sa týkajú nahrávania súborov:

V súbore php.ini:

  • Ak chcete zistiť, kde sa nachádza váš php.ini, spustite
  • nahrané_súbory- schopnosť zakázať alebo povoliť sťahovanie súborov vo všeobecnosti. Predvolená hodnota je Zapnutá.
  • upload_max_filesize- maximálna veľkosť súboru, ktorý je možné nahrať. Ak potrebujete pracovať s veľkými súbormi, zmeňte toto nastavenie. Predvolená hodnota je 2M. Nezabudnite zmeniť post_max_size.
  • post_max_size- všeobecný horný limit veľkosti prenášaných dát POST žiadosť. Ak potrebujete pracovať s veľkými súbormi alebo prenášať viacero súborov súčasne, zmeňte toto nastavenie. Predvolená hodnota je 8M.
  • upload_tmp_dir- dočasný adresár na serveri, do ktorého budú umiestnené všetky stiahnuté súbory. Skontrolujte, aké práva sú mu priradené (ak máte v tejto fáze nejaké problémy, pozrite si vysvetlenia na konci článku). Takýto adresár musí existovať a užívateľ, pod ktorým Apache beží, musí mať aj oprávnenia na zápis do tohto adresára. Ak pracujete s povoleným obmedzením open_basedir, dočasný adresár musí byť vnútri. Nemusíte sa starať o to, aby ste to čistili alebo robili názvy jedinečnými, PHP tento problém rieši za vás.

V súbore httpd.conf:

  • Najprv sa uistite, že používate Webový server Apache 1.3 (najnovšiu verziu v čase písania článku - 1.3.27). Ak používate Apache 2.0, mali by ste si prečítať nasledujúci výňatok z dokumentácie:

    Nepoužívajte Apache 2.0 a PHP v produkčnom prostredí ani na Unixe, ani na Windows.

  • Ak ste dostali správu " Metóda POST Nepovolené“, to znamená, že musíte hľadať niečo podobné nasledujúcim smerniciam a použiť kľúčové slovo Povoliť: Objednať povoliť, zamietnuť Povoliť od všetkých
  • Problémy so sťahovaním binárnych súborov - klasická otázka „prečo sa súbory zrútia pri nahrávaní“. Tu je riešenie, ktoré navrhol Dima Borodin (http://php.spb.ru): V adresári, kde sa nachádza skript, vytvorte súbor .htaccess, do ktorého zapíšeme: CharsetDisable On To file httpd.conf pridajte riadky: CharsetRecodeMultipartForms vypnuté

Niekoľko vysvetlení k tomuto receptu: vyššie popísaný problém, keď archívy nahrané na server nie sú rozbalené a obrázky sa nezobrazujú, môže nastať v dôsledku toho, že sa používa ruský webový server Apache. Direktíva CharsetDisable zakáže modul na spracovanie znakovej sady, t.j. pri sťahovaní súborov umiestnených v tomto priečinku nenastane žiadne prekódovanie. Direktíva CharsetRecodeMultipartForms zakazuje prekódovanie údajov prenášaných prostredníctvom metódy POST s hlavičkou Content-Type: multipart/form-data. Tie. binárne dáta prenášané s týmto nastavením budú ponechané v pôvodnej podobe a všetok ostatný obsah stránky bude prekódovaný podľa aktuálnych nastavení servera.

Môžu však nastať komplikácie: pripravte sa na to, že v niektorých prípadoch budete musieť textové časti žiadostí prekódovať sami. Tu je to, čo o tom hovorí dokumentácia:

Použite direktívu CharsetRecodeMultipartForms, ktorá bola zavedená v PL23, ale aj tak budete musieť manuálne prekódovať textové časti požiadaviek. Na tento účel môžete použiť ruské Apache API dostupné v iných moduloch alebo ruské Apache Perl API dostupné z mod_perl.

Jeden príklad určenia kódovania nájdete tu: http://tony2001.phpclub.net/detect_charset/detect.phps

Najnovšia dokumentácia pre ruský Apache sa nachádza na jeho oficiálnej webovej stránke: http://apache.lexa.ru/.

Nezabudnite, že po každej zmene konfigurácie je potrebné reštartovať webový server.

Je tiež možné nakonfigurovať nastavenia Apach pomocou .htaccess:

Php_value upload_max_filesize 50M php_value post_max_size 50M

Ďalšie funkcie

Nahrávanie viacerých súborov naraz

Príklad formulára na nahranie viacerých súborov:

Pošlite tieto súbory:


A nezabudnite zvýšiť post_max_size, ak sa očakáva veľa súborov

Automaticky nahrať súbory na server

Nezabudnite, že súbory na disku používateľa sú dôverné informácie, ku ktorým nemá JavaScript ani PHP najmenšie spojenie. Kým používateľ sám nevyberie súbor pomocou O nejakej práci s ním nemôže byť ani reči. A nezabudni na to tohto odboru hodnota vstupného atribútu je chránená proti zápisu.

Ukladanie súborov do databázy MySQL

Ak plánujete ukladať stiahnuté súbory do databázy, musíte si zapamätať nasledujúce body:

  • Musíte použiť pole BLOB
  • Pred vložením do databázy nezabudnite na reťazec použiť mysql_escape_string().
  • Pri zobrazovaní súboru musíte zadať hlavičku obsahu/typu

Pamätajte, že skript, ktorý zobrazuje váš kód HTML, nemá nič spoločné so skriptom, ktorý by mal zobraziť obrázok. Musí ísť o dve rôzne aplikácie.

Ukladanie obrázkov do databázy nie je dobrý štýl. Oveľa pohodlnejšie je ukladať do databázy iba cesty k súborom s obrázkami.

Získanie vlastností obrázka.

Ak stojíte pred úlohou skontrolovať typ alebo veľkosť obrázka pred nahraním súboru na server, budete potrebovať funkciu getimagesize(). Vezme názov súboru na disku ako argument a vráti pole, ktorého prvé dva prvky sú šírka a výška a tretí je typ obrázka. Ak sa z toho nedá čítať zadaný súbor správny obrázok, funkcia vráti hodnotu false.

Nahrávanie súborov s názvami v ruskom jazyku

Pri nahrávaní súborov na server musíte skontrolovať ich pôvodné názvy, či neobsahujú „neštandardné“ znaky (napríklad ruské písmená). Ak sú prítomné, musia sa vymeniť. Pôvodný názov súboru možno nájsť v premennej $_FILES["userfile"]["name"]. Ako prekódovať reťazec v ruskom jazyku na transliteráciu nájdete v príkladoch PHP.

Zobrazenie stavu sťahovania (ukazovateľ priebehu)

Je potrebné počítať s tým, že kým sa súbor úplne nestiahne, PHP nevie operovať ani s veľkosťou súboru, ani s percentom jeho stiahnutia. Iba ak je súbor na serveri PHP, môže získať prístup k informáciám. Ak stále nevyhnutne potrebujete implementovať túto funkciu, použite aplet Java.

Povolenia súboru

Problémy s právami na serveri (upload_tmp_dir)

V operačných systémoch podobných Unixu má každý priečinok, súbor a odkaz zodpovedajúce prístupové práva. Môžu vyzerať ako rwx-rw-r- alebo číslo 754.

Dostupnosť súboru alebo adresára závisí od ID užívateľa a ID skupiny, ktorej je užívateľ členom. Režim ako celok je opísaný v troch sekvenciách, z ktorých každá má tri písmená:

Skupina vlastníkov Iné (u) (g) (o) rwx rwx rwx

Vlastník, členovia skupiny a všetci ostatní používatelia tu majú práva čítať súbor, zapisovať doň a spúšťať ho. Práva sú akákoľvek zmysluplná kombinácia nasledujúcich písmen:

r Práva na čítanie. (4)
w Povolenie na zápis. (2)
x Vykonať právo (vyhľadávanie v katalógu). (1)

  • Nastavte vlastníka adresára na používateľa, s ktorého oprávneniami beží apache. To možno nájsť v súbore httpd.conf alebo zobrazením zoznamu procesov na serveri. Práva adresára musia byť 700 (rwx------).
  • Bez ohľadu na to, kto je vlastníkom adresára, nastavte povolenia na 777 (rwxrwxrwx).

    Príklad implementácie nahrávania obrázkov na server.

    $max_image_width = 380; $ max_image_height = 600; $max_image_size = 64 * 1024; $valid_types = array("gif","jpg", "png", "jpeg"); if (isset($_FILES["userfile"])) ( if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) ( $filename = $_FILES["userfile"]["tmp_name"]; $ ext = substr($_FILES["userfile"]["name"], 1 + strrpos($_FILES["userfile"]["name"], ".") if (filesize($filename) > $max_image_size ) ( echo "Chyba: Veľkosť súboru > 64 kB."; ) elseif (!in_array($ext, $valid_types)) ( echo "Chyba: Neplatný typ súboru."; ) else ( $veľkosť = GetImageSize($filename); ak (($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 "
    Odoslať tento súbor:
    "; }
  • Som rád, že vás vidím na stránkach mojej stránky. Dnes budeme hovoriť o implementácii nahrávania súborov na server. Téma je veľmi zaujímavá, pretože... Mnoho začiatočníkov sa zaujíma o túto otázku.

    Nahrávanie súborov na server pomocou PHP Vám výrazne uľahčí prácu pri vypĺňaní fotogalérie alebo pri návrhu webovej stránky pomocou editora (napr TinyMCE). Na server môžete tiež nahrať ľubovoľné typy súborov na základe vašich úloh.

    Ak chcete nahrať súbor na server, musíte vytvoriť formulár na nahrávanie súborov. V princípe tento formulár sa veľmi nelíši od pravidelná forma s textovými poľami, okrem toho typu nebude tam žiadny text, A súbor(keďže nahrávame súbory) a atribút sa pridá do samotného formulára enctype="multipart/form-data". Entype určuje typ kódovania, ktorý prehliadač použije na parametre formulára.

    PHP - Nahrávanie súborov na server sami

    Demo: Nahrávanie súborov na server

    Nahrajte svoje fotografie na server



    Vytvorili sme formulár na nahrávanie súborov, je čas napísať jednoduchý nástroj na nahrávanie súborov na server. Hneď určíme, že budeme len nakladať grafické súbory s typom jpeg, png, gif. Keď sme určili typy súborov, ktoré sa majú nahrať na server, musíme na samotnom serveri vytvoriť priečinok, do ktorého vložíme naše súbory. V mojom príklade je to priečinok s obrázkami, do ktorého vložíme naše súbory.

    "Nenastali žiadne chyby, súbor bol úspešne nahraný na server.", 1 => "Veľkosť prijatého súboru prekročila maximálnu povolenú veľkosť, ktorá je určená direktívou upload_max_filesize konfiguračného súboru php.ini.", 2 => "Veľkosť nahrávaného súboru prekročila hodnotu MAX_FILE_SIZE uvedenú vo formulári HTML.", 3 => "Stiahnutý súbor bol prijatý iba čiastočne.", 4 => "Súbor nebol stiahnutý.", 6 => " Chýba dočasný priečinok Pridaný v PHP 4.3.10 a PHP 5.0.3 "); //Definovanie typov súborov na odovzdanie $fileTypes = array("jpg" => "image/jpeg", "png" => "image/png", "gif" => "image/gif");//Ak je stlačené tlačidlo nahrávania if(isset($_POST["upload")]) ( //Skontrolujte, či sú dáta prázdne alebo nie if(!empty($_FILES)) ( //Skontrolujte chyby if($ _FILES["files" ]["error"] > 0) $err = $errUpload[$_FILES["files"]["error"]] //Skontrolujte typ súboru na nahranie if(!in_array($_FILES ["files"]["type"], $fileTypes)) $err = "Tento typ súboru
    ". $_FILES["files"]["type"] ."

    nevhodné na odovzdanie!"; //Ak sa nevyskytnú žiadne chyby, nahrajte súbor if(empty($err)) ( $type = pathinfo($_FILES["files"]["name"]); $name = $uploadDir ." /". $type["rozšírenie"]; move_uploaded_file($_FILES["files"]["tmp_name"],$name); header("Umiestnenie: http://". $_SERVER["HTTP_HOST"] ."/less/uploads/uploads.php?name=". $name exit ) else echo implode("); ", $err); ) ) //Správa o úspešnom nahraní súboru na server if(isset($_GET["name"])) echo " Súbor

    ". htmlentities($_GET["name"]) ."< count($imgDir); $i++) { if($i % 2 == 0) echo "
    úspešne načítané! "; //Zobrazenie obrázkov z adresára $imgDir = array_values(array_diff(scandir($uploadDir), array("..", "."))); for($i = 0; $i

    "."\n"; echo "

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

    ; Maximálny čas vykonania každého skriptu v sekundách max_execution_time = 3000 ; Maximálny čas, ktorý môže každý skript stráviť analýzou požiadavky na údaje max_input_time = 400 ; Maximálne množstvo pamäte, ktorú môže skript spotrebovať (8 MB) memory_limit = 500M ; Maximálna veľkosť dát POST, ktorú PHP akceptuje. post_max_size = 500 miliónov ; Maximálna povolená veľkosť pre nahrané súbory. upload_max_filesize = 200 miliónov

    Viacdielne formuláre

    • webové rozhrania poštové služby, ktoré vám umožňujú pridať prílohu (prílohu) k listu a na to musíte najprv nahrať súbor na server a až potom ho môžete pridať k listu;
    • Interaktívne fotogalérie a fotoalbumy, ktoré nemôžu existovať bez mechanizmu na nahrávanie súborov na server;
    • Portály bezplatného softvéru, ktoré sa používajú na výmenu súborov rôznych programov atď.

    Nahrávanie súboru na server sa vykonáva pomocou viacdielneho formulára, ktorý má pole na nahrávanie súboru. Parameter enctype je nastavený na multipart/form-data :



    Takto bude vyzerať daný viacdielny formulár (môžete ho skúsiť použiť na zobrazenie výsledku viacdielnych formulárov nahratím malého súboru na server):

    Viacdielne formuláre zvyčajne používajú metódu odoslania POST. Ako vidíte v predchádzajúcom príklade, tento formulár má dve polia:

    • Pole výberu súboru na odovzdanie ;
    • Pole na zadanie názvu súboru, ktorý bude mať na serveri .

    Spracovanie viacdielnych formulárov

    Skôr ako začnete písať skript na spracovanie viacdielneho formulára, musíte upraviť konfiguračný súbor php.ini aby sa umožnilo nahrávanie súborov na server.

    Konfigurácia súbor PHP php.ini má tri parametre súvisiace s nahrávaním súborov na server:

    • file_uploads=Zapnuté - umožňuje nahrávanie súborov na server cez HTTP;
    • upload_tmp_dir=/tmp - nastaví adresár pre dočasné ukladanie nahraných súborov;
    • upload_max_filesize=2M - nastavuje maximálnu veľkosť nahrávaných súborov.

    Ak váš webový server beží operačný systém Linux, potom musíte reštartovať službu:

    reštart služby httpd

    Ako PHP spracováva viacdielne formuláre? Po prijatí súboru ho uloží do dočasného adresára s názvom upload_tmp_dir s náhodne vybraným názvom súboru. Potom vytvorí štyri premenné superglobálneho poľa $_FILES . Toto pole obsahuje informácie o stiahnutom súbore.

    Premenné definované pre nahrané súbory závisia od verzie PHP a aktuálna konfigurácia. Superglobálne pole $_FILES je dostupné od PHP 4.1.0. V prípade, že je konfiguračná direktíva register_globals nastavená na na, dodatočne budú deklarované premenné s príslušnými názvami. Od verzie 4.2.0 je predvolená hodnota pre voľbu register_globals vypnuté.

    Obsah poľa $_FILES pre náš príklad je uvedený nižšie. Všimnite si, že to predpokladá, že názov uploadfile sa použije pre pole na výber súboru, ako je uvedené vo formulári s viacerými časťami vyššie. Samozrejme, názov poľa môže byť akýkoľvek.

    • $_FILES["uploadfile"]["name"] – názov súboru pred odoslaním na server, napríklad pict.gif;
    • $_FILES["uploadfile"]["veľkosť"] - veľkosť prijatého súboru v bajtoch;
    • $_FILES["uploadfile"]["type"] - MIME typ prijatého súboru (ak ho prehliadač dokázal rozpoznať), napríklad: obrázok/gif, obrázok/png, obrázok/jpeg, text/html;
    • (tak sme nazvali pole nahrávania súboru) – obsahuje názov súboru v dočasnom adresári, napríklad: /tmp/phpV3b3qY;
    • $_FILES["uploadfile"]["error"] - Kód chyby, ktorý sa môže vyskytnúť pri sťahovaní súboru. kľúč ["chyba"] bol pridaný v PHP 4.2.0. Môžete vidieť zodpovedajúce chybové kódy

    Po dokončení skriptu sa dočasný súbor odstráni. To znamená, že pred dokončením skriptu ho musíme skopírovať na iné miesto. To znamená, že algoritmus skriptu na nahranie súboru na server je nasledujúci:

    Ak stlačíte tlačidlo "Odoslať", súbor už bude nahraný na server a jeho názov bude v premennej $_FILES["uploadfile"]["name"]. V tomto prípade by mal skript okamžite skopírovať súbor s názvom $_FILES["uploadfile"]["tmp_name"] do nejakého adresára (vyžadujú sa práva na zápis do tohto adresára).

    Súbor sa skopíruje pomocou funkcie kopírovať () :

    Používajte iba funkciu kopírovania copy(), nie funkciu presunu, pretože:

    • Dočasný súbor sa automaticky odstráni;
    • Ak je dočasný adresár na inom médiu, zobrazí sa chybové hlásenie.

    Povedzme, že potrebujeme nahrať súbor do adresára uploads, ktorý sa nachádza v koreňovom adresári webového servera (v adresári DocumentRoot).

    // Pre každý prípad si vytvoríme adresár. Ak už bola vytvorená,
    // neuvidíme chybové hlásenie, pretože použijeme operátor @:

    @mkdir("uploads", 0777);

    // Skopírujte súbor z /tmp do uploadov
    // Názov súboru bude rovnaký ako pred odoslaním na server:

    Copy($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));

    Na Linuxe je všetko oveľa komplikovanejšie – musíme brať do úvahy oprávnenia adresára uploads. S najväčšou pravdepodobnosťou v tomto prípade funkcia mkdir() nebude fungovať, pretože nemáme oprávnenie na zápis do adresára DocumentRoot (zvyčajne /var/www/html alebo /home/httpd/html). Prihláste sa ako root, vytvorte adresár na nahrávanie a zmeňte jeho vlastníka a povolenia nasledovne:

    // Vytvorte adresár pre nahrávanie

    // Nastavte meno vlastníka apache a jeho skupinu - tiež apache:

    Chown apache: nahrávanie apache

    // Umožniť každému písať (777) + nastaviť priľnavý bit (1):

    Nahrávanie Chmod 1777

    Veľkosť súboru môže byť v prípade potreby obmedzená, môžete upraviť súbor .htaccess a obmedziť prístup do adresára uploadov – zadajte buď konkrétnych používateľov, ktorí majú prístup k adresáru, alebo IP adresy.

    Teraz môžete nahrať súbory na server.

    píšeme si PHP skript nahrávanie súborov na server


    // Adresár, do ktorého dostaneme súbor:
    $uploaddir = "./files/" ;
    $uploadfile = $uploaddir . basename($_FILES["uploadfile"]["name"]);

    // Skopírujte súbor z adresára na dočasné uloženie súborov:
    if (kopírovať ($ _FILES [ "uploadfile" ][ "tmp_name" ], $uploadfile ))
    {
    ozvena "

    Súbor bol úspešne odovzdaný na server

    " ;
    }
    inak (echo "

    Chyba! Nepodarilo sa nahrať súbor na server!

    "
    ;

    VÝCHOD ; )
    ozvena "

    // Zobrazenie informácií o stiahnutom súbore:

    "
    ;
    ozvena "

    Informácie o súbore nahranom na server: Pôvodný názov odovzdaného súboru: "

    " ;
    ozvena "

    .$ _FILES [ "uploadfile" ][ "name" ]. " Typ MIME nahraného súboru: "

    " ;
    ozvena "

    .$ _FILES [ "uploadfile" ][ "type" ]. " Veľkosť nahraného súboru v bajtoch: "

    " ;
    ozvena "

    .$ _FILES [ "súbor na odovzdanie" ][ "veľkosť" ]. " Dočasný názov súboru: "

    " ;

    ?>

    .$ _FILES [ "uploadfile" ][ "tmp_name" ]. " Nahrávanie viacerých súborov je možné realizovať napríklad pomocou rôznych hodnoty názvu

    pre vstupnú značku.


    Pošlite tieto súbory:






    Posielajte súbory Ak bol odoslaný takýto formulár, polia $_FILES["userfile"] , $_FILES["userfile"]["name"] a $_FILES["userfile"]["size"] budú inicializované (v rovnakom spôsobom, napríklad $HTTP_POST_FILES pre PHP 4.1.0 a novší). Ak je konfiguračná direktíva register_globals nastavená na on , inicializujú sa aj sprievodné globálne premenné. Každá z týchto premenných bude numericky indexované pole zodpovedajúcich hodnôt pre prijaté súbory.

    Predpokladajme, že boli načítané súbory /home/test/some.html a /home/test/file.bin. V tomto prípade bude mať premenná $_FILES["userfile"]["name"] hodnotu some.html a premenná $_FILES["userfile"]["name"] bude mať hodnotu file.bin . Podobne premenná $_FILES["userfile"]["veľkosť"] bude obsahovať veľkosť súboru some.html atď.

    Premenné $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["size"] a $_FILES["userfile"]["type"] budú tiež inicializované.

    záver:

    Ako vidíte, organizovanie nahrávania súborov na server nie je také ťažké. Zabezpečiť požadovanú úroveň bezpečnosti je náročnejšie, keďže nahrávanie súborov na server môžu útočníci zneužiť na útok na server. Informácie o tom, ako zabezpečiť požadovanú úroveň zabezpečenia pri práci s funkciami Uploads, nájdete na.



    <<< Назад Obsah Vpred >>>
    Ak máte ďalšie otázky alebo vám niečo nie je jasné, vitajte u nás

    Aplikácia na nahrávanie súborov na server je HTML formulár (upload.html) a skript upload.php na jeho spracovanie.

    komentár: Priemyselnú verziu systému pre nahrávanie súborov na server si môžete stiahnuť zo sekcie. Systém vám umožní nielen nahrať súbor na server, ale aj zmeniť jeho veľkosť, pozadie atď.

    Kód formulára (upload.html)

    Formulár na nahranie súboru





    Kód skriptu spracovania formulára (upload.php)

    Výsledok sťahovania súboru 1024 * 3 * 1024 ) ( echo (); výstup; ) // Skontrolujte, či je súbor načítaný if(is_uploaded_file ($_FILES [ "názov súboru" ][ "názov_tmp" ])) ( // Ak je súbor úspešne načítaný, presuňte ho // z dočasného adresára do konečného adresára move_uploaded_file ($_FILES [ "názov súboru" ][ "názov_tmp" ], "/cesta/k/súboru/" . $_FILES [ "názov súboru" ][ "názov" ]); ) inak ( echo (); } ?>

    "Chyba pri načítavaní súboru"

    Atribút entype formulára určuje typ kódovania, ktorý prehliadač aplikuje na parametre formulára. Aby odosielanie súborov na server fungovalo, atribút entype musí byť nastavený na multipart/form-data. Štandardne je tento atribút nastavený na application/x-www-form-urlencoded.

    Po prijatí požiadavky HTTP sa obsah nahraného súboru zapíše do dočasného súboru, ktorý sa vytvorí v predvolenom adresári servera pre dočasné súbory, pokiaľ nie je v súbore php.ini určený iný adresár (smernica upload_tmp_dir).

    Charakteristiky prevzatého súboru sú dostupné cez dvojrozmerné pole$_FILES.

    Skript upload.php nahrá súbor na server a skopíruje ho do adresára /path/to/file/.

    V niektorých prípadoch je potrebné obmedziť veľkosť súboru, ktorý je možné nahrať na server. Napríklad, ak chcete na server nahrať iba súbory nie väčšie ako 3 MB, vyššie uvedený skript obsahuje kód:

    1024 * 3 * 1024 ) ( echo ( "Veľkosť súboru presahuje tri megabajty");

    VÝCHOD; ) ... ?>

    Maximálnu veľkosť nahrávaného súboru je možné nastaviť aj pomocou direktívy upload_max_filesize, ktorej predvolená hodnota je 2 MB:

    Aktualizované: 23.12.2020
    Ak si všimnete chybu, vyberte časť textu a stlačte Ctrl+Enter