Načítanie súborov na server pomocou PHP. Príklad stiahnutia súborov na server (upload) v PHP Ako si stiahnuť PHP súbor

Určite často stiahnite si rôzne súbory na stránkach. Napríklad, nahrané avatary na fóre, Fotografie na sociálnych sieťach, rôzne videá na video hostiteľov, len súbory na zdieľanie súborov. A tu v tomto článku sa naučíte ako nahrať súbory na server v PHP. Prechádza Php. Vo väčšine prípadov sa to realizuje.

V prvom rade, čo sa má učiť, je to Tvar HTMLv ktorom je súbor substituovaný, nesmie byť celkom normálna, tu je príklad HTML kód Takáto forma:





Kľúčovým bodom je atribút " incipovať sa"S významom" multipart / form-dáta". Bez nej nebude fungovať.

"V ktorom súbore stále si stiahneme, a my prejdeme trochu na rôznych dôležitých bodoch, ktoré sa musia zohľadniť, inak bezpečnosť môže ovplyvniť: \\ t

Print_r ($ _ súbory);
?>

V dôsledku toho uvidíte obsah. globálne dvojrozmerné pole $ _FILES:

  • názov. - Názov stiahnutého súboru.
  • typ - Typu mime Stiahnuteľný súbor. Toto je snáď najdôležitejším parametrom pre bezpečnosť. A vždy, keď sa musia skontrolovať prijímanie súborov Typu mimeV opačnom prípade nie sú žiadne problémy. V ďalšom článku o tom budeme hovoriť podrobnejšie.
  • tmp_name. - Fyzická cesta k dočasnému súboru. Na tomto mieste je umiestnený súbor, a to len potom nosíme na iné miesto. V skutočnosti je súbor už načítaný a potrebujeme ho presunúť len na požadovaný priečinok na serveri.
  • chyba - kód chyby. Ak 0 , Neexistujú žiadne chyby.
  • veľkosť - Veľkosť stiahnutého súboru. Toto je tiež často použitá možnosť, a mala by sa tiež skontrolovať obmedzte veľkosť prevzatých súborov. Samozrejme, že táto veľkosť je obmedzená, však pre všetky obrázky, táto veľkosť je jednoznačne nadhodnotená (spravidla, on 10 MB).

A všetky tieto parametre sú prítomné pre každý súbor na stiahnutie (z ktorých každý je pole v dvojrozmernom poli. $ _FILES.).

Teraz skončím stiahnite si súbory na server v PHPA na to napíšeme taký kód (""):

$ uploadfile \u003d "obrázky /". 01 súbory [" somename "] [" Name "];
Move_Uploaded_file ($ _ súbory ["somename"] ["TMP_NAME"], $ UPLOADFILE);
?>

To znamená, že najprv zadáme cestu k stiahnuteľnému súboru na serveri. Tu chceme dať súbor do adresára " snímky"S rovnakým názvom, ktorý bol pred súborom. A funkcia move_Uploaded_file () Súbor presunieme do adresára svojho vybraného adresára z jeho dočasného skladovania.

Venujte však pozornosť, je to veľmi dôležité! Takže kód používajte v žiadnom prípade, inak vaše stránky ohrozí vážne nebezpečenstvo! V skutočnosti, momentálne je možné stiahnuť absolútne, čo: akékoľvek spustiteľné súbory, skripty, Html panvica A iné veľmi nebezpečné veci. Preto je potrebné veľmi starostlivo skontrolovať súbory na prevzatie do servera. A tak sa budeme zaoberať nasledujúcim článkom. Pretože téma je veľmi dôležitá, potom vám poradím, aby ste si prihlásili aktualizácie, aby ste nenechali ujsť tento článok.

V prehliadači máte zablokovaný JavaScript. Povoliť JavaScript pre prácu webu!

Načítanie súborov na server

Krátke odozvy pri nahrávaní

Čo je nahrané súbory, alebo prečo nefunguje
kopírovať ("C: Images Sample.jpg", "http://mysite.ru/Uploads/sample.jpg")

Aj keď máte k dispozícii len jeden počítač, na ktorom sú server a pracovná stanica zarovnaná, nezabudnite, že PHP používa technológiu klienta / servera. Súbor, ktorý chceme nahrať, sa zvyčajne nachádza na vozidle klienta, t.j. Používateľ, obyčajný návštevník stránok. Cieľom je server. Aby sme vykonali proces prenosu súborov, potrebujeme nasledovný formulár:

Odoslať tento súbor:

V tomto prípade musí byť URL vášho PHP skriptu zadaná v oblasti akcie, ktorá bude pokračovať v spracovaní stiahnutých súborov. Pole skryté pole MAX_FILE_SIZE musí predchádzať pole pre výber súborov a obsahovať maximálnu povolenú veľkosť súboru v bajtoch. Jeho priradenie je skontrolovať veľkosť súboru, kým sa súbor odosiela na server. Mala by uložiť užívateľa z dlhého a neúspešného prevzatia súboru na server a tvorbu nadmernej prevádzky, ale nemali by sa obzvlášť spoliehať na toto obmedzenie, pretože sa dajú ľahko dostať okolo neho.

Čo sa stane, keď užívateľ si vybral súbor na jeho disku a stlačte tlačidlo "Odoslať súbor"? Prehliadač odošle súbor na server, kde tlmočník PHP umiestni do svojho dočasného adresára tým, že ho priradí náhodné meno a vykoná skript zadaný v oblasti akcie.

Ako by sa mal Upload.php vyzerať?

$ uploaddir \u003d "/ var / www / uploads /"; IF (MOVE_UPLOADED_FILE ($ _ SÚBORY ["UserFile"] ["TMP_NAME"], $ UPLOADDIR. $ _FILES ["userfile"] ["Názov"]) (Print "súbor je platný a bol úspešne nahraný.";) Inak (vytlačiť "tam nejaké chyby!";)

Pri písaní skriptu vzniká prirodzená otázka: Ako získať informácie o stiahnutom súbore a dosiahnuť samotný súbor. Ak používate PHP verziu 4.1.0 a staršie, bude najlepšie odkazovať na Global $ _Files Array. Pre každý prevzatý súbor obsahuje hashové pole, s nasledujúcimi údajmi:

  • $ _FILES ["USERFILE"] ["NAME"] - pôvodný názov súboru, napríklad užívateľ, videl, výber súboru;
  • $ _FILES ["userfile"] ["Typ"] - napríklad súbor MIME / typ, môže byť image / gif; Toto pole je užitočné na uloženie, ak chcete poskytnúť rozhranie na prevzatie prevzatých súborov;
  • $ _FILES ["userfile"] ["Veľkosť"] - veľkosť stiahnutého súboru;
  • $ _FILES ["USERFILE"] ["TMP_NAME"] - úplná cesta k dočasnému súboru na disku;
  • $ _FILES ["userfile"] ["Chyba"] - Počnúc verziou 4.2.0 obsahuje kód chyby, ktorý je 0, ak operácia úspešne prešla.

Pre verziu PHP pod 4.1.0 sa toto pole nazýva $ http_post_files. Nezabudnite, že na rozdiel od $ _files, toto pole nie je superglobal a pri prístupe k nej, napríklad z funkcie, je potrebné explicitne špecifikovať globálne $ http_post_files;

Ak sa ďalšie premenné $ USERFILE_NAME, $ USERFILE_TYPE, $ USERFILE_SIZE, $ USERFILE_TYPE, $ USERFILE_SIZE, budú vytvorené v nastaveniach registra_globals \u003d ON, ... Vzhľadom na to, že začínajúc verziou 4.2.0, predvolené nastavenia registrácie_globals \u003d Vypnuté používanie týchto premenných sa neodporúča, aj keď definovali. Najlepší spôsob, ako získať informácie o prevzatých súboroch, je použitie radu $ _files.

Ak chcete pracovať s prevzatými súbormi, je najlepšie použiť vstavané funkcie IS_UPLOAD_FILE () a MOVE_UPLOADEED_FILE (), ktoré skontrolujú, či bol súbor načítaný a umiestnil ho do zadaného priečinka, resp. Podrobnejšie informácie nájdete na manuálnych stránkach. Nie je potrebné vymyslieť bicykel a pracovať s dočasnými súbormi sami, skopírujte ich, odstrániť. Už sa vám to urobilo a pre vás.

Serverové ladenie

Urobil som všetko správne, ale niečo pre mňa nefunguje. Možno mám nesprávne nakonfigurovaný server?

Ak ste "urobili všetko správne", ale váš kód nefunguje, alebo to funguje nesprávne, neponáhľajte sa na zúfalstvo. Možno problém nie je vo vašich rukách, ale v nesprávnych nastaveniach servera. Tu je zoznam smerníc, ktoré súvisia s prevzatím súborov:

V súbore php.ini:

  • Ak chcete vedieť, kde sa nachádza váš php.ini, vykonajte
  • file_uploads. - Schopnosť zákazu alebo povolenie sťahovania súborov ako celku. Zapnuté.
  • upload_max_filesize - maximálna veľkosť súboru, ktorú možno stiahnuť. Ak potrebujete pracovať s veľkými súbormi, zmeňte toto nastavenie. V predvolenom nastavení 2M Nezabudnite zmeniť post_max_size.
  • post_max_size. - všeobecný limit na vrchole údajov prenášaných v požiadavke na príspevok. Ak potrebujete pracovať s veľkými súbormi, alebo pošlite viacero súborov súčasne, zmeňte toto nastavenie. Predvolená hodnota je 8m.
  • uPLOAD_TMP_DIR. - Dočasný adresár na serveri, na ktorý budú umiestnené všetky súbory na prevzatie. Skontrolujte, ktoré práva sú na ňom stanovené (ak máte problémy s ťažkosťami v tomto štádiu, pozrite si vysvetlenie na konci článku). Takýto adresár musí mať tiež užívateľa, pod ktorou sa vykonáva Apache, musí byť tiež právo písanie do tohto adresára. Ak pracujete s povoleným obmedzením Open_Basedir - potom musí byť dočasný adresár vo vnútri. Nemusíte sa starať o jej upratovanie alebo jedinečné mená, PHP rieši tento problém pre vás.

V súbore httpd.conf.:

  • Po prvé, uistite sa, že používate webový server Apache 1.3 (najnovšia verzia v čase písania článku - 1.3.27). Ak používate Apache 2.0, mali by ste prečítať nasledujúce výňatky z dokumentácie:

    Nepoužívajte Apache 2.0 a PHP vo výrobnom prostredí ani na UNIX ani v systéme Windows.

  • Ak ste dostali správu "POST METÓDA NIE JE POLOŽKÁ", znamená to, že musíte hľadať niečo podobné nasledujúcim smerniciam a používať kľúčové slovo umožňujúce: Objednávka Povoliť, popierať dovoliť od všetkých
  • Problémy so sťahovaním binárnych súborov - klasická otázka "Prečo súbory bojujú pri nahrávaní". Tu je riešenie rozhodnutia navrhovaného DiMA Borodinom (http://php.spb.ru): v adresári, kde sa skript leží, urobte súbor .htaccess, v ktorom píšeme: charsetdizable na súbor httpd.conf. Pridať riadky: Charsetrecodemultipartforms off

Malé vysvetlenia, k tomuto receptu: vyššie uvedený problém, keď archívy načítané na server nie sú neplatené, a obrázky sa nezobrazia, môže sa vyskytnúť z dôvodu, že sa používa ruský webový server APACHACH. Smernica CharsetDisable zakáže modul modulu spracovania chartsetu, t.j. Žiadne transkodovanie Pri sťahovaní súborov umiestnených v tomto priečinku sa nevyskytne. Smernica CHARSETRECODEMULTIPARTFORMUS vypne transkodovanie dát prenášané metódou post s obsahom obsahu: MultiPart / Form-dátový záhlavie. Tí. Binárne údaje prenášané s takýmto nastavením budú ponechané v pôvodnej forme a všetky zvyšky výplne lokality sa prepisuje podľa aktuálneho nastavenia servera.

Ale v rovnakom čase môžu vzniknúť komplikácie: Buďte pripravení na skutočnosť, že v niektorých prípadoch sa textové časti požiadaviek budete musieť prebíjať. To je to, čo je dokumentácia hovorí o tom:

Použite smernicu CHARSETRECODEMULTIPARTFORMU, ktorá sa objavila v PL23, ale stále musíte recode manuálne textové časti. Aby ste to mohli urobiť, môžete použiť Ruské API APACH API dostupné v iných moduloch alebo Russian Apache Perl API k dispozícii z MOD_PERL.

Jedným z príkladov definície kódovania nájdete tu: http://tony2001.phpclub.net/detect_arset/detect.phps

Najnovšia dokumentácia o ruskom Apache je na jeho oficiálnej stránke: http://pache.exa.ru/.

Nezabudnite, že po akejkoľvek zmene konfigurácie musíte reštartovať webový server.

Môžete tiež konfigurovať parametre Apach pomocou.Htaccess:

Php_value upload_max_filesize 50m php_value post_max_size 50m

Pridané vlastnosti

Načítanie viacerých súborov v rovnakom čase

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

Odoslať tieto súbory:


A nezabudnite na zvýšenie post_max_size.Ak sa predpokladá veľa súborov

Automatické prevzatie súborov na server

Nemali by ste zabúdať, že súbory na disku používateľa sú dôverné informácie, na ktoré nie je ani Javascript ani tak oveľa viac PHP nízky vzťah. Kým užívateľ vybral súbor pomocou pomoci Bez ohľadu na to, čo s ním môže pracovať a reč. A nezabudnite, že toto pole vstupného poľa je atribút hodnoty je chránený pred nahrávaním.

Ukladanie súborov v databáze MYSQL

Ak ste zhromaždení na ukladanie súborov na stiahnutie v databáze, musíte si zapamätať nasledujúce body:

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

Pamätajte, že skript zobrazí váš HTML nie je v žiadnom prípade pripojený k skriptu, ktorý musí obrázok vydať. Tieto musia byť dve rôzne aplikácie.

Skladovanie obrázkov v databáze nie je dobrý štýl. Je oveľa pohodlnejšie uložiť v databáze len na obrazové súbory.

Získanie vlastností obrazu.

Ak máte úlohu skontrolovať typ alebo veľkosť obrázka pred prevzatím súboru na server, budete potrebovať funkciu GetimagesIze (). Ako argument, prijíma názov súboru na disku a vráti pole, prvé dva prvky, ktorého je šírka a výška, v tomto poradí, tretí je typ obrazu. Ak nie je možné čítať správny obrázok zo zadaného súboru, funkcia vráti lož.

Vkladanie súborov s názvom ruského jazyka

Pri sťahovaní do súboru servera musíte skontrolovať svoje pôvodné názvy pre prítomnosť "neštandardných" znakov (napríklad ruské písmená). V prípade ich prítomnosti je potrebné nahradiť. Pôvodný názov súboru nájdete v $ _Files ["userfile"] ["Name"] premenná. Ako dobiť ruský jazykový reťazec na preklad, ktorý ste možno nájsť v príkladoch PHP.

Zobrazenie stavu sťahovania (lišta Progress)

Treba mať na pamäti, že kým sa súbor úplne stiahne, PHP nemôže fungovať alebo veľkosť súboru alebo percentuálny podiel jeho zaťaženia. Iba vtedy, keď je súbor už na serveri PHP, bude môcť pristupovať k informáciám. Ak ešte potrebujete implementovať takúto príležitosť, použite Java-Applet.

Práva na súbory

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

V operačných systémoch podobných UNIXu, každý priečinok, súbor, prepojenie nastaví súlad s povoleniami. Môžu vyzerať ako RWX-RW-R- alebo ako číslo 754.

Dostupnosť súboru alebo adresára závisí od ID užívateľa a identifikátora skupiny, v ktorom vstupuje. Režim ako celok je opísaný z hľadiska troch sekvencií, tri písmená:

Majiteľ Iná skupina (U) (g) (o) RWX RWX RWX

Tu, majiteľ, členovia skupiny a všetci ostatní používatelia majú práva na čítanie súboru, napísať na ňu a jeho vykonanie. Práva - Akákoľvek zmysluplná kombinácia týchto písmen:

r právo čítať. (štyri)
W právo na nahrávanie. (2)
x Právo na vykonanie (vyhľadávanie v adresári). (jeden)

  • Nainštalujte vlastníka užívateľského adresára, s ktorým atrakcie vykonáva Apache. To možno nájsť z súboru httpd.conf alebo prezeranie zoznamu procesov na serveri. Práva adresárov by mali byť 700 (RWX -----).
  • Bez ohľadu na to, kto majiteľ katalógu stanoví práva 777 (RWXRWXRWX).

    Príklad implementácie sťahovania obrázkov na server.

    $ max_image_width \u003d 380; $ Max_Image_Height \u003d 600; $ max_image_size \u003d 64 * 1024; $ platné_types \u003d pole ("GIF", "JPG", "PNG", "JPEG"); Ak (Isset ($ _ súbory ["userfile"])) (IF (IS_UPLOADEED_FILE ($ _ SÚBORY ["UserFile"] ["TMP_NAME"]) ($ FileName \u003d $ _files ["userfile"] ["TMP_NAME"] $ Ext \u003d substr ($ _ _ súbory ["userfile"] ["Názov"], 1 + strROS ($ _ _ súbory ["USERFILE"] ["NÁZOV"], ".")); Ak (súbory (súbory $) )\u003e $ Max_Image_size) (ECHO "Chyba: Veľkosť súboru\u003e 64K.";) Elendif (! In_Array ($ EXT, $ BUTDE_TYPES)) (ECHO "Chyba: Neplatný typ súboru.";) Ina ($ Size \u003d Getimagesize ($ Názov súboru); ak ((((veľkosť $) && (veľkosť $)< $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:
    "; }
  • V našom článku považujeme za príklad vytvorenia php súbor download skriptu na server. Náš jednoduchý príklad stiahnutia súborov bude mať 2 súbory: form (form.html), php súbor na stiahnutie skript (Uploader.php).

    Teraz budeme všetko podrobne analyzovať. Po prvé, analyzovať formulár formulára formulára:


    Ako vidíte tento jednoduchý kód HTML, tu nie je nič komplikované, jediný, ak formulár načíta súbory na server, potom musí byť atribút zaregistrovaný eNCTYPE \u003d "multiPart /formaÚdaje ".

    Naša forma bude vyzerať takto:

    PríkladPHP súbor download skript

    Teraz to vymyslíme s PHP súborom, ktorý si stiahne súbory na server. Nižšie je jeho zdrojový kód:

    // kde súbor bude umiestnený $ TARGET_PATH \u003d 'UPLOADED_FILES / "; / * Pridať pôvodný názov súboru do našej cieľovej cesty. Výsledok je" UPLOWLED_FILES / FOUNEENAME.EXTENCE "* / $ TARGET_PATH \u003d $ TARGET_PATH. Basename ($ _ _ Súbory ["FILE"] ["NÁZOV"]); IF (MOVE_UPLOADEED_FILE ($ _ SÚBORY ["FILE"] ["TMP_NAME"], $ TARGET_PATH) (ECHO "FILE". BASENAME ($ _ súbory ["súbor "] [" Názov "])." Bol nahraný ";) inak (ECHO" Tam bolo chybné nahrávanie súboru, skúste to znova! ";)

    Ako download php súbor script?

    upload.php je jednoduchý php súbor na stiahnutie skript na server, ktorý si stiahne naše súbory do konkrétneho adresára stránok, ktorý je zadaný $ TARCEART_PATH \u003d "UPLOADED_FILES /" String;

    No, samo o sebe, robíme elementárny výstup správ pomocou IF / iného, \u200b\u200bbolo jasné, náš súbor je načítaný alebo nie.

    Hacker hacking ochrana pri sťahovaní súboru

    Budeme zvážiť nielen ochranu, pokiaľ ide o hackering hacker, ale aj ďalšie nežiaduce problémy, ktoré vznikajú pri sťahovaní súborov na server.

    Php súbor shell

    Toto je prvý problém priradený k sťahovacím súborom na server. Keď súbor sťahovania má php shell, a to neznamená, že jeho rozšírenie bude PHP. Môže mať zobrazenie image.jpg (.gif, .png ...). Ale vo vnútri vyzerajú takto:

    Niektorí remeselníci môžu tiež vykonať príkazy na serveri pomocou surfovania URL:

    $ Curl http: //server/Uploads/shell.php? Príkaz \u003d any_unix_command

    Metóda ochrany:

    Ak chcete chrániť, môžete implementovať kontrolu súborov MIME. Nižšie nájdete príklad:

    Ak ($ _ súbory ["súbor"] ["Typ"]! \u003d "Image / GIF") (ECHO "Ospravedlňujeme sa, že len všetky nahrávajú obrázky GIF"; Exit;)

    Tento kus kódu PHP kontroluje, či súbor sťahovacím súborom GIF je súbor. Vložte tento kód pred php súborom download script. Samozrejme, môžete zmeniť šek na jpg, pngi ďalšie súbory, ktoré potrebujete.

    Je pravda povedať, a tento spôsob ochrany môže byť obchádzaný, ak pošlete hlavičku hlavičky, s pokynmi MIME. Na to je potrebné skontrolovať dostupnosť Značky v súborovom súbore.

    Obmedzenie veľkosti prevzatého súboru

    Môžu existovať aj problémy s veľkými veľkosťami súborov, ktoré zaberajú miesto na disku. Ak to chcete urobiť, napíšte limit na veľkosť prevzaté súborom.

    Môžete to urobiť pomocou formulára, na to musíte pridať nasledujúci riadok do kontextu HTML formy:

    Toto skryté vstupné pole obmedzí veľkosť downloadového súboru. Alebo môžete skontrolovať veľkosť súboru nástrojov PHP.

    Napíšte O.pHP súbor download script môže byť dlhá, ale už sme demontovali základný princíp sťahovania súborov na server. Preto, ak má niekto viac otázok, opýtajte sa ich v komentároch.

    Dnes, súbor na stiahnutie súborov na server (hosting) sa nachádza na všetkých stránkach sociálnych sietí, bulletinových dosiek, zoznamovacích lokalít atď. Podstatou je umožniť návštevníkom webového zdroja zverejniť svoje súbory (fotografie, dokumenty) na internete.

    Pri poskytovaní tejto služby je jeden podstatný mínus. Faktom je, že tým, že vám umožní stiahnuť súbor na váš server, my, ako to bolo, nainštalujte dvere, za ktorou je potrebné konštantné ovládanie. Vzhľadom k tomu, v súbore návštevníka, môžu existovať nielen užitočné informácie, ale aj vírusový kód, ktorý môže neskôr umožniť útočníkom, aby prevzali váš server. Vzhľadom na tento mínus si musíte pred prevzatím na server starostlivo skontrolovať súbory.

    Ale nebudem vás zastrašovať, ale radšej si predstavujem vašu pozornosť, ktorá už bola pripravená funkcia (PHP skript) na kontrolu a prevzatie súborov na server. Funkcia je 100% práca. Používam ho na svojich stránkach. Táto funkcia je napísaná na sťahovanie obrazových súborov (fotografií) vo formáte.jpg, .gif, .png. Ale ak si želáte, môžete vykonať zmeny, aby ste prispôsobili PHP skriptu svojim potrebám.

    V php skript sa implementujú dve kontroly:

    1. vzhľadom k tomu, hoster limity veľkosti prevzatia súboru (v čase písania tohto materiálu, mám 8 MB limit na mojom hostingu), potom je potrebné skontrolovať maximálnu veľkosť;
    2. kontrola rozšírenia súboru Umožňuje prerušiť zbytočné súbory pred prevzatím.

    Dúfam, že funkčný kód je dostatočne vysvetlený, aby sa zaoberal súborom prevzatia na server. Ale ak máte nejaké otázky, budem rád odpovedať v komentároch.

    Teraz o tom, ako ho realizovať prakticky

    Kód PHP umiestnime v samostatnom súbore: Function.php a umiestnime ho na server v koreňovom adresári.

    A vytvoriť súbor HTML, v ktorom chcete vytvoriť fotografiu Stiahnuť formulár: index.html

    uPLOAD.PHP - FORME FORMULÁR
    NÁZOV \u003d "Tlačidlo" - Názov tlačidla, keď kliknete na to, ktorý súbor sťahovania súborov sa spustí serveru

    Načítanie viacerých súborov

    Teraz budeme analyzovať prípad, keď potrebujete prevziať viacero súborov na server.
    Aby sme to urobili, potrebujeme vo funkciách.php súbory update.php a index.html vykonať nejaké zmeny.





    Možno, toto je všetko, čo potrebujete na implementáciu služby na prevzatie užívateľského súboru na server (hosting).

    Ďalšou funkciou, ktorá úzko súvisí s sťahovaním grafických súborov (Fotografie) je funkcia na zmenu veľkosti obrázkov:

    Multipart-formy

    • Web Ierfaces of Postal Services, ktoré vám umožňujú pridať aplikáciu na písmeno (pripojenie), a pre to najprv musíte prevziať súbor na server a až po tom, čo je možné pridať do písmena;
    • Interaktívne fotogalérie a fotoalbumy, ktoré nemôžu existovať bez mechanizmu na prevzatie súboru na server;
    • Bezplatné softvérové \u200b\u200bportály, ktoré sa používajú na výmenu súborov rôznych programov atď.

    Sťahovanie súboru na server sa vykonáva pomocou multipart-form, v ktorom je pole načítanie súborov. Parameter scotypu označuje MultiPart / Form-Data:



    To bude vyzerať ako daný multipart form, ktorý bude vyzerať (môžete sa pokúsiť vidieť výsledok multipart-formy, sťahovanie nejaký malý súbor na server):

    Multipart-formy zvyčajne používajú metódu post prenosu. Ako možno vidieť z predchádzajúceho príkladu, tento formulár má dve polia:

    • Pole výber súboru pre stiahnutie ;
    • Pole určovania názvu súboru, ktorý bude musieť mať na serveri .

    Spracovanie formulárov Multipart

    Pred pokračovaním s písaním viacnásobného spracovateľského skriptu, musíte upraviť konfiguračný súbor php.ini. Povolenie na prevzatie súborov na server.

    Konfiguračný súbor PHP PHP.INI má tri parametre spojené s prevzatím súborov na server:

    • fILE_UPLOADS \u003d ON - Umožňuje prevziať súbory na server prostredníctvom protokolu HTTP;
    • uPLOAD_TMP_DIR \u003d / TMP - Nastaví adresár na dočasné ukladanie stiahnutých súborov;
    • uPLOAD_MAX_FILESIZE \u003d 2M - Nastaví maximálne množstvo stiahnutých súborov.

    Ak váš webový server spustí operačný systém Linux, potom musíte servis reštartovať:

    servis HTTPD reštart.

    Ako spracováva php multipart-formy? Po obdržaní súboru ho uloží do dočasného adresára UPLOAD_TMP_DIR, názov súboru je zvolený náhodne. Potom vytvára štyri premenné superglobal poľa $ _files. Toto pole obsahuje informácie o prevzatých súboroch.

    Premenné definované pre prevzaté súbory závisia od verzie PHP a aktuálnej konfigurácie. Superglobal $ _files Array je k dispozícii od PHP 4.1.0. V prípade, že konfiguračná smernica register_globals je nastavený podľa hodnoty na.bude navyše vyhlásené premenné s príslušnými menami. Od verzie 4.2.0 je predvolená hodnota pre možnosť Register_globals vypnúť.

    Obsah poľa $ _Files pre náš príklad sú uvedené nižšie. Upozorňujeme, že sa predpokladá, že použije názov uploadfile pre pole pre výber súborov v súlade s vyššie uvedeným multipartmom. Samozrejme, že 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"] ["Typ"] - MIME Typ prijatého súboru (ak ho prehliadač mohol určiť), napríklad: Image / GIF, Image / PNG, Image / JPEG, text / HTML;
    • (Takže sme volali pole na prevzatie súborov) - 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 načítaní súboru. Kľúče ["chyba"] Bol pridaný do PHP 4.2.0. S príslušnými chybovými kódmi sa môžete zoznámiť

    Po dokončení skriptu sa dočasný súbor vymaže. To znamená, že ho musíme kopírovať na iné miesto, kým nie je skript dokončený. To znamená, že algoritmus pre pracovný scenár na prevzatie súborov na server je:

    Ak je stlačené tlačidlo "Odoslať", súbor sa už stiahne na server a jeho názov bude v $ _files ["Uploadfile"] ["Name"] premenná. V tomto prípade musí skript okamžite skopírovať súbor s názvom $ _FILES ["UPLOADFILE"] ["TMP_NAME"] Do určitého katalógu (musíte napísať do tohto adresára).

    Kopírovanie súborov sa vykonáva podľa funkcie kopírovať () :

    Používajte iba kópiu () kópiu () funkciu a nepohybujte sa, 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.

    Predpokladajme, že potrebujeme prevziať súbor do adresára Uploads, ktorý sa nachádza v koreňovom adresári webového servera (v adresári dokumentov).

    // Len v prípade, vytvorte adresár. Ak je už vytvorený,
    // chybové hlásenie Nevidíme, pretože budeme používať operátor @

    @mkdir ("Uploads", 0777);

    // Skopírujte súbor z / TMP v nahraní
    // názov súboru bude rovnaký ako pred odoslaním na server:

    Kopírovať ($ _ súbory ["UPLOADFILE"] ["TMP_NAME"], "UPLOADS /". BASENAME ($ _ súbory ["Uploadfile"] ["Name"]));

    V Linuxe je všetko oveľa komplikovanejšie - musíme zohľadniť prístupové práva na katalóg uploadov. S najväčšou pravdepodobnosťou, v tomto prípade funkcia mkdir () Nebude to fungovať, pretože nemáme právo napísať do adresára DocumentRoot (zvyčajne / var / www / html alebo / httpd / html). Zaregistrujte sa ako koreňový systém, vytvorte adresár nahrávania a zmeňte jeho vlastník a prístupové práva takto:

    // Vytvorte katalóg pridaní

    // Nainštalujte názov vlastníka Apache a jeho skupinu - APACHACH:

    CHOWN APACHE: APACHE UPLOADS

    // Rozlíšenie napísať všetkým (777) + Inštalácia upevňovacieho bitov (1):

    Chmod 1777 Uploads.

    Veľkosť súboru môže byť obmedzená, ak si želáte, môžete upravovať súbor .htaccess a obmedziť prístup do adresára Uploads - zadať alebo špecifických používateľov, ktorí môžu pristupovať k adresárovi alebo IP adries.

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

    Píšeme php skript na stiahnutie súborov na server


    // katalóg, v ktorom dostaneme súbor:
    $ uploaddir \u003d "./files/";
    $ Uploadfile \u003d $ uploaddir. Basename ($ _FILES ["UPLOADFILE"] ["NAME"]);

    // Skopírujte súbor z adresára pre dočasné ukladanie súborov:
    ak (kópie ($ _files ["UPLOADFILE"] ["TMP_NAME"], $ UPLOADFILE)
    {
    echo. "

    Súbor sa úspešne prevzatý na server.

    " ;
    }
    inak (Echo "

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

    "
    ; \\ T východ; )

    // Zobraziť informácie o stiahnutom súbore:
    echo. "

    Informácie o súbore načítanom serveri:

    "
    ;
    echo. "

    Pôvodný názov prevzatého súboru: ", $ _FILES ["UPLOADFILE"] ["NAME"]. "

    " ;
    echo. "

    MIME Typ stiahnutého súboru: ", $ _FILES ["UPLOADFILE"] ["TYPY"]. "

    " ;
    echo. "

    Veľkosť zaťaženého súboru v Bytes: ", $ _FILES ["Veľkosť"] ["Veľkosť"]. "

    " ;
    echo. "

    Dočasný názov súboru: ", $ _FILES ["UPLOADFILE"] ["TMP_NAME"]. "

    " ;

    ?>

    Načítanie viacerých súborov je možné implementovať pomocou, napríklad rôzne hodnoty názvov pre vstupnú značku.

    Poskytuje tiež schopnosť automaticky získať informácie organizované do radu niekoľkých súčasne stiahnuteľných súborov. Ak chcete implementovať takúto príležitosť, použite rovnakú syntax údajov poľa z HTML formy, ako pre viacnásobné zvoľte a zaškrtnite políčko:


    Odoslať tieto súbory:






    V prípade, že bola takáto forma odoslaná, polia $ _files ["userfile"], $ _files ["userfile"] ["Name"] a $ _files ["userfile"] ["Veľkosť"] sa inicializuje (v Rovnakým spôsobom ako $ http_post_files for PHP 4.1.0 a staršie verzie). Ak je register_globals Configuration Smernica nastavená na hodnotu On, súvisiace globálne premenné budú tiež inicializované. Každá z týchto premenných bude numericky indexované pole zodpovedajúcich hodnôt pre prijaté súbory.

    Predpokladajme, že súbory /home/test/some.html a /home/test/file.bin boli stiahnuté. V tomto prípade bude mať premenná $ _FILES ["USERFILE"] ["NAMEFILE"] ["NAME"]. Podobne premenná $ _files ["userfile"] ["Veľkosť"] bude obsahovať veľkosť súboru niektoré.html a tak ďalej.

    Premenné $ _FILES ["USERFILE"] ["NAME"], $ _FILES ["USERFILE"] ["TMP_NAME"], $ _FILES ["userfile"] ["veľkosť"] a $ _files ["userfile"] ["Typ"] sa tiež inicializujú.

    Záver:

    Ako vidíte, nie je tak ťažké usporiadať sťahovanie súborov na server. Je ťažšie poskytnúť potrebnú úroveň bezpečnosti, pretože načítanie súborov na server môžu byť použité útočníkmi na server. Ako poskytnúť potrebnú úroveň bezpečnosti, práca s obrázkami, pozri.



    <<< Назад Obsah Dopredu \u003e\u003e\u003e
    Existujú stále otázky alebo niečo nezrozumiteľné - vitajte v našom