Načítání souborů na server pomocí PHP. Příklad stahování souborů na server (Upload) v PHP Jak ke stažení souboru PHP

Jistě vy často stáhněte si různé soubory na stránkách. Například, nahrány avatary na fóru, Fotografie na sociálních sítích, různá videa na video hostitele, jen soubory na sdílení souborů. A tady v tomto článku se naučíte jak nahrát soubory na server v PHP. Je to přes Php. Ve většině případů je to implementováno.

Za prvé, co se naučit, je to sama Forma html.Ve kterém soubor je nahrazen, nesmí být zcela normální, zde je příklad HTML kód Taková forma:





Klíčovým bodem je atribut " enctype."S významem" multipart / Form-Data". Bez ní nebude fungovat.

"Ve kterém jsme stále nestáhneme soubor, a my budeme procházet trochu v různých důležitých bodech, které je třeba vzít v úvahu, jinak může zabezpečení ovlivnit:

Print_r ($ _ soubory);
?>

V důsledku toho uvidíte obsah. globální dvojrozměrné pole $ _files:

  • název. - název staženého souboru.
  • typ - Mime-type. Soubor ke stažení. To je možná nejdůležitějším parametrem pro bezpečnost. A vždy při přijímání souborů musí být zkontrolovány Mime-type.Jinak nejsou žádné problémy. V dalším článku o tom budeme mluví podrobněji.
  • tmp_name. - Fyzická cesta k dočasnému souboru. Je to v tomto místě, že soubor je umístěn a teprve pak nesou na jiné místo. Ve skutečnosti je soubor již načten a musíme jej pouze přesunout do požadované složky na serveru.
  • chyba - chybový kód. Pokud 0 Neexistují žádné chyby.
  • velikost - Velikost staženého souboru. To je také často použitá možnost a měla by být také zkontrolována omezte velikost stažených souborů. Samozřejmě, že tato velikost sama je omezená, nicméně, pro jakékoliv obrazy, tato velikost je jasně nadhodnocena (jako pravidlo, on 10 MB.).

A všechny tyto parametry jsou přítomny pro každý soubor ke stažení (každý z nich je pole ve dvourozměrném poli. $ _Files.).

Teď pojďme stáhnout soubory na server v PHPA pro to budeme psát takový kód (""):

$ uploadfile \u003d "obrázky /".
Move_uploaded_file ($ _ soubory ["Somename"] ["TMP_NAME"], $ UploadFile);
?>

To znamená, že zpočátku uvádíme cestu ke stahovatelnému souboru na serveru. Zde chceme soubor v adresáři " snímky"Se stejným názvem, který byl před souborem. A funkce move_uploaded_file () Soubor přesuíme do adresáře vybraného adresáře z jeho dočasného úložiště.

Věnujte však pozornost, je velmi důležité! Použijte kód v žádném případě, jinak se vaše stránky ohrožuje vážné nebezpečí! Ve skutečnosti, v okamžiku, kdy lze stáhnout absolutně cokoliv: jakékoli spustitelné soubory, skripty, Html Pan. A další velmi nebezpečné věci. Proto je nutné zkontrolovat soubory ke stažení na server velmi opatrně. A tak se budeme zabývat v dalším článku. Vzhledem k tomu, že téma je velmi důležité, pak vám doporučuji, abyste se přihlásili k odběru aktualizací, takže nezmeškáte tento článek.

Ve vašem prohlížeči máte blokován JavaScript. Nechte JavaScript pracovat na webu!

Načítání souborů na server

Short Exours v nahrávání

Co je vkládání souborů, nebo proč nefunguje
kopírovat ("C: snímky Sample.jpg", "http://mysite.ru/uploads/sample.jpg")

I když máte k dispozici pouze jeden počítač, na kterém je server a pracovní stanice zarovnány, nezapomeňte, že PHP používá technologii klient / server. Soubor, který chceme nahrát, se obvykle nachází na klientském autě, tj. Uživatel, běžný návštěvník stránek. Destinace je server. Chcete-li provést proces přenosu souborů, potřebujeme následující formulář:

Zaslat tento soubor:

V tomto případě musí být URL vašeho PHP skriptu zadán v poli Akce, která bude i nadále zpracovávat stažené soubory. Pole Skryté max_file_size musí předcházet pole pro výběr souboru a obsahovat maximální povolenou velikost souboru v bajtech. Jeho úkolem je zkontrolovat velikost souboru, i když je soubor odeslán na server. To by mělo ušetřit uživatele z dlouhého a neúspěšného stahování souboru na server a tvorbu nadměrného provozu, ale neměl by být obzvláště spoléhat na toto omezení, protože je snadné se dostat kolem něj.

Co se stane, když uživatel vybere soubor na disk, a stisknete tlačítko "Odeslat soubor"? Prohlížeč odešle soubor na server, kde to interpret PHP umístí do dočasného adresáře přiřazením náhodného jména a provede skript zadaný v poli Akce.

Jak by mělo být upload.php vypadat?

$ uploaddir \u003d "/ var / www / uploads /"; Pokud (Move_Uploaded_file ($ _ soubory ["UserFile"] ["TMP_NAME"], $ Uploaddir. $ _files ["UserFile"] ["Name"]) (Print "]) (Print" Soubor je platný a byl úspěšně nahrán. ";) Jinak (tiskněte "nějaké chyby!";)

Při psaní skriptu vzniká přirozená otázka: Jak získat informace o staženém souboru a dosáhnout samotného souboru. Pokud používáte PHP verzi 4.1.0 a starší, bude nejlepší odkazovat na globální $ _Files pole. Pro každý stažený soubor obsahuje hash pole s následujícími daty:

  • $ _Files ["UserFile"] ["Jméno"] - původní název souboru, například, jak ji uživatel viděl, vybral soubor;
  • $ _Files ["UserFile"] ["typ"] - například soubor MIME / typu, může být image / gif; Toto pole je užitečné pro uložení, pokud chcete poskytnout rozhraní pro stahování stažených souborů;
  • $ _Files ["UserFile"] ["Velikost"] - velikost staženého souboru;
  • $ _Files ["UserFile"] ["TMP_NAME"] - úplná cesta k dočasnému souboru na disku;
  • $ _Files ["UserFile"] [Chyba "] - Počínaje verzí 4.2.0 obsahuje kód chyby, který je 0, pokud operace úspěšně projde.

Pro verzi PHP pod 4.1.0 se toto pole nazývá $ http_post_files. Nezapomeňte, že na rozdíl od $ _files není toto pole superglobal a při přístupu k němu, například z funkce, je nutné explicitně určit globální $ http_post_files;

Pokud další proměnné $ UserFile_name, $ userfile_type, $ userfile_size, $ userfile_type, $ userfile_size, $ userfile_size, bude vytvořena v nastavení register_globals \u003d on, ... s ohledem na to, že počínaje verzí 4.2.0, výchozí nastavení register_globals \u003d Vypnuto použití těchto proměnných se nedoporučuje, i když jsou definovány. Nejlepší způsob, jak získat informace o stažených souborech, je použití pole $ _files.

Chcete-li pracovat se staženými soubory, je nejlepší použít vestavěné funkce is_uploaded_file () a move_uploaded_file (), což zkontrolujte, zda byl soubor načten, a umístěn jej do zadané složky. Podrobnější informace naleznete na ručních stránkách. Není nutné vymyslet kolo a pracovat s dočasnými soubory sami, zkopírujte je, smazat. To už bylo provedeno a pro vás.

Tuning serveru

Udělal jsem všechno správně, ale něco pro mě nefunguje. Možná mám nesprávně nakonfigurovaný server?

Pokud jste "udělal všechno správné", ale váš kód nefunguje, nebo to funguje nesprávně, nespěchejte na zoufalství. Možná, že problém není ve vašich rukou, ale ve špatném nastavení serveru. Zde je seznam směrnic, které souvisejí s stahováním souborů:

V souboru php.ini:

  • Pokud chcete vědět, kde se nachází php.ini, vykonávejte
  • soubor_uploads. - Schopnost zakázat nebo povolit stahování souborů jako celku. Výchozí nastavení.
  • upload_max_fileSize. - Maximální velikost souboru, kterou lze stáhnout. Pokud potřebujete pracovat s velkými soubory, změňte toto nastavení. Ve výchozím nastavení 2m Nezapomeňte změnit post_max_size.
  • post_max_size. - Obecný limit v horní části dat přenášených v příspěvku. Pokud potřebujete pracovat s velkými soubory, nebo odeslat více souborů současně, změnit toto nastavení. Výchozí hodnota je 8m.
  • upload_tmp_dir. - Dočasný adresář na serveru, ke kterému budou umístěny všechny soubory ke stažení. Zkontrolujte, která práva jsou na něm stanovena (pokud máte potíže v této fázi, viz vysvětlení na konci článku). Takový adresář musí mít také uživatele, ve kterém se provede Apache, musí být také právo zapisovat do tohoto adresáře. Pokud pracujete s povolenou omezením Open_Basedir - pak musí být dočasný adresář uvnitř. Nemusíte se postarat o její čištění nebo jedinečná jména, PHP tento problém vyřeší pro vás.

V souboru httpd.conf.:

  • Za prvé, ujistěte se, že používáte webový server Apache 1.3 (nejnovější verzi v době psaní článek - 1.3.27). Pokud používáte Apache 2.0, měli byste si přečíst následující výpis z dokumentace:

    Nepoužívejte Apache 2.0 a PHP v produkčním prostředí ani na Unixu ani na Windows.

  • Pokud jste obdrželi zprávu "Post Metoda není Alloded", znamená to, že musíte hledat něco podobného následujícím směrnicím a používat klíčové slovo Povolit: Objednávka Povolit, Deny umožňuje především
  • Problémy se stahováním binárních souborů - klasická otázka "Proč soubory bojují v nahrávání". Zde je řešení rozhodnutí navrhl DIMA Borodin (http://php.spb.ru): V adresáři, kde skript lží, provést soubor .htaccess, ve kterém píšeme: charsetisable na soubor httpd.conf. Přidat řádky: Charsetrecodemultipartforms off.

Malá vysvětlení k tomuto receptu: Výše \u200b\u200buvedený problém Pokud archivy načtené na server nejsou nezaplaceny a obrázky se nezobrazují, může dojít kvůli skutečnosti, že se používá ruský webový server Apache. Směrnice CharSetDisable zakáže modulový modul zpracování charsetu, tj. Při stahování souborů umístěných v této složce nedochází k žádnému překročení souborů. Směrnice CHARSETRECODEMULTIPARTFORMS se vypne data přenosu přenosu metodou POST s obsahem obsahu: Multipart / Form-Data Header. Ty. Binární data přenášená s takovým nastavením budou ponechány v originálním podobě a všechny zbytek výplně lokality budou přepracovány podle aktuálních nastavení serveru.

Zároveň však mohou komplikace vzniknout: být připraveni na skutečnost, že v některých případech budou textové části žádostí muset recodovat sami. To je to, co o tom dokumentaci říká:

Použijte směrnici CHARSTRECODEMUTIPARTIFFORMS, která se objevila v PL23, ale stále musíte opakovat ručně textové části. K tomu můžete použít ruské apache API dostupné v jiných modulech nebo Russian Apache Perl API k dispozici od společnosti Mod_Perl.

Jedním z příkladů definice kódování naleznete zde: http://ony2001.phpclub.net/detect_charset/detect.phps

Nejnovější dokumentace o ruském Apache je na jeho oficiálních stránkách: http://apache.lexa.ru/.

Nezapomeňte, že po jakékoli změně konfigurace musíte restartovat webový server.

Můžete také konfigurovat parametry APACH pomocí.htAccess:

Php_value upload_max_fileSize 50m php_value post_max_size 50m

Další funkce

Vložení více souborů současně

Příklad stahování formuláře několika souborů:

Odeslat tyto soubory:


A nezapomeňte se zvýšit post_max_size.Pokud má mnoho souborů

Automatické stahování souborů na server

Neměli byste zapomenout, že soubory na disku uživatele jsou důvěrné informace, které ani JavaScript ani tolik php má nízký vztah. Dokud uživatel nezvolil soubor pomocí nápovědy Bez ohledu na to, co s ním může jít a řeč. A nezapomeňte, že toto pole vstupního pole je atribut hodnoty je chráněn před nahráváním.

Skladování souborů v databázi MySQL

Pokud se shromáždíte ukládat soubory ke stažení v databázi, musíte si pamatovat následující body:

  • Musíte použít pole BLOB
  • Před uložením do databáze nezapomeňte použít řetězec MySQL_ESCAE_STRING ()
  • Při zobrazení souboru musíte zadat záhlaví obsahu / typu

Nezapomeňte, že skript zobrazuje váš HTML není v žádném případě připojen k skriptu, který musí obraz výstup. Musí to být dva různé aplikace.

Skladování obrázků v databázi není dobrý styl. Je mnohem pohodlnější uložit v databázi pouze obrazových souborů.

Získání vlastností obrazu.

Pokud máte úkol zkontrolovat typ nebo velikost obrázku před stažením souboru na server, budete potřebovat funkci GetImageSize (). Jako argument přijímá název souboru na disku a vrátí pole, z nichž první dva prvky jsou šířka a výška, v tomto pořadí, je třetí typ obrázku. Pokud je nemožné číst správný obraz ze zadaného souboru, funkce vrátí lži.

Načítání souborů s názvem ruska

Při stahování do souboru serveru musíte zkontrolovat jejich původní názvy pro přítomnost "nestandardních" znaků (například ruských písmen). V případě jejich přítomnosti je nutné nahradit. Původní název souboru naleznete v hodnotě $ _Files ["UserFile"] ["Jméno"] proměnné. Jak dobít rusko-jazyk řetězec přeložit, můžete se nalézt v příkladech PHP.

Stáhnout zobrazení stavu (Progress Bar)

Je třeba mít na paměti, že dokud soubor není plně stažen, PHP nemůže pracovat nebo velikost souboru nebo procento jeho načítání. Pouze pokud je soubor již na PHP serveru, bude moci přistupovat k informacím. Pokud stále potřebujete takovou příležitost implementovat, použijte java applet.

Práva na soubory

Problémy s právy na serveru (upload_tmp_dir)

V operačních systémech podobných UNIXu, každá složka, soubor, odkaz nastavuje dodržování oprávnění. Mohou vypadat jako RWX-RW-R- nebo jako číslo 754.

Dostupnost souboru nebo adresáře závisí na ID uživatele a identifikátoru skupiny, ve které vstupuje. Režim jako celek je popsán ve třech sekvencích, tři písmena:

Majitel Další skupina (U) (g) (o) rwx rwx rwx

Zde má majitel, členové skupiny a všichni ostatní uživatelé práva číst soubor, napsat mu a jeho provádění. Práva - jakákoli smysluplná kombinace následujících písmen:

r Právo číst. (čtyři)
W Právo na záznam. (2)
X Právo na provedení (hledání v adresáři). (jeden)

  • Nainstalujte majitele uživatelského adresáře, s jejichž atrakcí provádí Apache. To lze nalézt z souboru httpd.conf nebo prohlížení seznamu procesů na serveru. Práva adresářů by měla být 700 (RWX ------).
  • Bez ohledu na to, kdo vlastník katalogu, stanoví práva 777 (RWXRWXRWX).

    Příklad implementace stahování obrázků na server.

    $ max_image_width \u003d 380; $ MAX_IMAGE_HEIGHT \u003d 600; $ max_image_size \u003d 64 * 1024; $ valid_types \u003d array ("gif", "jpg", "png", "jpeg"); IF (ISSET ($ _ soubory ["UserFile"])) (pokud (is_uploaded_file ($ _ soubory ["UserFile"] ["TMP_NAME"]) ($ filename \u003d $ _Files ["UserFile"] ["TMP_NAME"] ; $ EXT \u003d Substr ($ _ soubory ["UserFile"] ["Name"], 1 + StrRPOS ($ _ soubory ["UserFile"] ["Jméno"], ".")); Pokud (souborový název souboru) )\u003e $ MAX_IMAGE_SIZE) (echo "Chyba: Velikost souboru\u003e 64k.";) Elseife (!! In_Artay (! Název souboru); pokud ((velikost $) && (velikost $)< $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 "
    Zaslat tento soubor:
    "; }
  • V našem článku považujeme příklad vytváření skriptu stahování souboru PHP na server. Náš příklad ke stažení souborů bude mít 2 soubory: Form (Form.html), PHP souboru Stáhnout skript (Uploader.php).

    Nyní budeme podrobně analyzovat vše. Nejprve analyzujte soubor formuláře formulář.html:


    Jak vidíte tento jednoduchý kód HTML, není zde nic složitého, jediný, pokud formulář bude načíst soubory na server, pak atribut musí být registrován enctype \u003d "mULTIPART /formulář-data ".

    Naše forma bude vypadat takto:

    PříkladPHP soubor stáhnout skript

    Nyní to přijdeme s souboru PHP, který bude stahovat soubory na server. Níže je jeho zdrojový kód:

    // tam, kde bude soubor umístěn $ TARGET_PATH \u003d 'Uploaded_Files / "; / * Přidejte původní název souboru naší cílovou cestu. Výsledek je" Uploaded_Files / filename.extension "* / $ TARGET_PATH \u003d $ TARGET_PATH. BASENAME ($ _) Soubory ["Soubor"] ["Name"]); pokud (Move_Uploaded_file ($ _ soubory ["soubor"] ["TMP_NAME"], $ TARGET_PATH)) (echo "soubor". Basename ($ _ soubory ["Soubor) "] [" Jméno "])." Bylo nahráno ";) jinak (echo" došlo k chybě nahrávání souboru, zkuste to prosím znovu! ";)

    Jak to má php soubor stáhnout skript?

    uploader.php je jednoduchý php soubor stáhnout skript na server, který stáhne naše soubory do konkrétního adresáře webu, který je zadán $ target_path \u003d "uploaded_files /" řetězec;

    Samotným, sama o sobě provádíme elementární výstup zpráv pomocí Pokud / jinak, bylo jasné, náš soubor je načten nebo ne.

    Hacker hackování ochrany při stahování souboru

    Uvažujeme o ochraně nejen ochranu, pokud jde o hacking hacker, ale i další nežádoucí problémy, které vznikají při stahování souborů na server.

    PHP soubor Shell.

    Toto je první problém spojený se stahováním souborů na server. Když má soubor ke stažení php shell, což neznamená, že jeho rozšíření bude PHP. To může mít zobrazení image.jpg (.gif, .png ...). Ale uvnitř vypadá takto:

    Někteří řemeslníci mohou také provést příkazy na serveru pomocí Surfování URL:

    $ Curl http: //server/uploads/shell.php? Command \u003d any_unix_command

    Metoda ochrany:

    Pro ochranu, můžete implementovat kontrolu souboru MIME. Níže naleznete příklad:

    Pokud ($ _ soubory ["Soubor"] ["typ"]! \u003d "Image / GIF") (iewo "Promiň, my všichni nahráli obrázky GIF"; výstup;)

    Tento kus PHP kód kontroluje, zda je soubor ke stažení GIF soubor. Tento kód vložte před Scriptem souboru PHP. Přirozeně můžete změnit kontrolu na JPG, pngi další soubory, které potřebujete.

    Je pravda, a tato metoda ochrany může být vynechána, pokud posíláte záhlaví záhlaví, s instrukcemi MIME. Chcete-li to provést, je nutné zkontrolovat dostupnost Značky v souboru ke stažení.

    Omezení velikosti staženého souboru

    Mohou existovat také problémy s velkými velikostí souborů, které zaujímají místo na disku. Chcete-li to provést, napište limit velikosti staženého souboru.

    Můžete to udělat pomocí formuláře, pro tento účel je třeba přidat následující řádek do kontextu formuláře HTML:

    Toto skryté vstupní pole omezí velikost souboru ke stažení. Nebo můžete zkontrolovat velikost souboru nástrojů PHP.

    Psát o.skript php souboru download může být dlouhý, ale už jsme demontovali základní princip stahování souborů na server. Proto, pokud má někdo více otázek, zeptejte se jich v komentářích.

    Dnes, služba stahování souborů na server (hosting) se nachází na všech stránkách sociálních sítí, bulletinových desek, datování stránkách atd. Podstatou je umožnit návštěvníkovi webového zdroje publikovat své soubory (fotografie, dokumenty) na internetu.

    Při poskytování této služby je jedno podstatné mínus. Skutečností je, že tím, že vám umožní stáhnout soubor na server, my, jak to bylo, nainstalovat dveře, za které je nutné konstantní ovládání. Vzhledem k tomu, že v souboru návštěvníka mohou být nejen užitečné informace, ale také virový kód, který může později umožnit útočníkům, aby převzali váš server. Vzhledem k tomuto minusu musíte před stažením na server pečlivě zkontrolovat soubory.

    Ale nebudu vás zastrašit, ale raději bych si představoval vaši pozornost již hotovou funkci (PHP skript) pro kontrolu a stahování souborů na server. Funkce je 100% pracující. Já sám ho používám na svých stránkách. Tato funkce je napsána pro stahování obrazových souborů (fotografie) ve formátu.jpg, .gif, .png. Ale pokud si přejete, můžete provést změny přizpůsobit skriptu PHP na vaše potřeby.

    Dva kontroly jsou implementovány v Script PHP:

    1. vzhledem k tomu, že hoste omezuje velikost staženého souboru (v době psaní tohoto materiálu, mám 8 MB limit na mém hostování), pak je nutná kontrola maximální velikosti;
    2. kontrola rozšíření souboru umožňuje před stažením odříznout nepotřebné soubory.

    Doufám, že kód funkce je dostatečně vysvětlen k řešení souboru ke stažení na server. Ale pokud máte nějaké dotazy, rád budu odpovědět na komentáře.

    Nyní o tom, jak ho realizovat prakticky

    Funkce PHP kódujeme v samostatném souboru: Function.php a umístěte jej na server v kořenovém adresáři.

    A vytvořte soubor HTML, ve kterém chcete po odeslání formátu ke stažení fotografie: index.html

    upload.php - Manipulátor formuláře souborů
    Jméno \u003d "Tlačítko" - název tlačítka, když kliknete na kliknutí, ke které funkce stahování souborů spustí serveru

    Načítání více souborů

    Nyní budeme analyzovat případ, kdy je třeba stáhnout více souborů na server.
    Chcete-li to provést, potřebujeme v Function.php soubory Update.php a index.html provést některé změny.





    Možná je vše, co potřebujete k implementaci služby pro stahování uživatelského souboru na server (hosting).

    Další funkce, která úzce souvisí s stahováním grafických souborů (fotografie), je funkce pro změnu velikosti obrázků:

    Multipart-forem

    • Web Ierfaces of Poštovní služby, které vám umožní přidat aplikaci na písmeno (Attach) a pro tuto nejprve je třeba stáhnout soubor na server a teprve poté, co může být přidán do dopisu;
    • Interaktivní fotogalerie a fotoalba, které nemohou existovat bez mechanismu stahování souborů na server;
    • Volné softwarové portály, které slouží k výměně souborů různých programů atd.

    Stahování souboru na server se provádí pomocí multipart-Form, ve kterém je pole načítání souborů. Parametr Encotype označuje multipart / formulář-data:



    To bude vypadat jako daný vícenásobný formulář, který bude vypadat (můžete se pokusit zobrazit výsledek multipartových formulářů, stahování nějakého malého souboru na server):

    Multifunkční formy obvykle používají metodu příspěvku. Jak je vidět z předchozího příkladu, tento formulář má dvě pole:

    • Pole výběr souborů ke stažení ;
    • Pole zadávání názvu souboru, který bude muset mít na serveru .

    Multipart zpracování formuláře

    Před zahájením psaní Skript zpracování multipart-formulář musíte upravit konfigurační soubor php.ini. Chcete-li povolit stahování souborů na server.

    Konfigurační soubor PHP Php.ini má tři parametry spojené s stahováním souborů na server:

    • file_Uploads \u003d On - Umožňuje stahovat soubory na server přes protokol HTTP;
    • upload_tmp_dir \u003d / TMP - Nastaví adresář dočasně ukládat stažené soubory;
    • upload_max_FileSize \u003d 2m - Nastaví maximální množství stažených souborů.

    Pokud váš webový server spustí běží operačního systému Linux, musíte službu restartovat:

    služba httpd restart.

    Jak php rukojeť multipart-formuláře? Po obdržení souboru jej uloží do dočasného adresáře upload_tmp_dir, název souboru je zvolen náhodně. Pak vytváří čtyři proměnné SuperGlobal Array $ _files. Toto pole obsahuje informace o staženém souboru.

    Proměnné definované pro stažené soubory závisí na verzi PHP a aktuální konfiguraci. SuperGlobal $ _Files Array je k dispozici od PHP 4.1.0. V případě, že směrnice o konfiguraci Register_Globals nastaví hodnotou nA.budou navíc deklarovány proměnné s příslušnými názvy. Od verze 4.2.0 je výchozí hodnota volby register_globals vypnuto.

    Obsah pole $ _Files pro náš příklad je uveden níže. Vezměte prosím na vědomí, že se předpokládá, že používáte název UploadFile pro pole pro výběr souborů v souladu s výše uvedeným multipartovým formulářem. Samozřejmě, že název pole může být jakýkoliv.

    • $ _Files ["uploadfile"] ["Název"] - název souboru před odesláním na server, například pict.gif;
    • $ _Files ["uploadfile"] ["velikost"] - velikost přijatého souboru v bajtech;
    • $ _Files ["UploadFile"] ["typ"] - MIME typ přijatého souboru (pokud byl prohlížeč schopen určit), například: Obrázek / GIF, Image / PNG, Image / JPEG, Text / HTML;
    • (Tedy jsme nazvali pole ke stažení souborů) - obsahuje název souboru v dočasném adresáři, například: / tmp / phpvv3b3qY;
    • $ _Files ["uploadfile"] ["ERROR"] -Chybový kód, který může dojít při načtení souboru. Klíč ["chyba"] Přidá se k PHP 4.2.0. S příslušnými chybovými kódy se můžete seznámit

    Po dokončení skriptu bude dočasný soubor vymazán. To znamená, že je musíme zkopírovat na jiné místo, dokud není skript dokončen. To znamená, že algoritmus pro pracovní scénář stažení souboru na server je:

    Pokud je stisknuto tlačítko "Odeslat", soubor bude již stažen na server a jeho název bude v hodnotě $ _Files ["UploadFile"] ["Name"] proměnná. V tomto případě musí skript okamžitě kopírovat soubor s názvem $ _Files ["uploadfile"] ["TMP_NAME"] Do nějakého katalogu (musíte psát do tohoto adresáře).

    Kopírování souborů se provádí funkcí kopírovat () :

    Používejte pouze funkci kopírování () kopírování () a nepohybující se, protože:

    • Dočasný soubor bude automaticky odstraněn;
    • Pokud je dočasný adresář na jiném médiu, zobrazí se chybová zpráva.

    Předpokládejme, že musíme stáhnout soubor do adresáře pro nahrávání, který je umístěn v kořenovém adresáři webového serveru (v adresáři Directory DocumentRoot).

    // právě v případě, vytvořte adresář. Pokud je již vytvořen,
    // Chybová zpráva Nebudeme vidět, protože budeme používat operátor @

    @mkdir ("Uploads", 0777);

    // Zkopírujte soubor z / tmp v nahrávkách
    // název souboru bude stejný jako před odesláním na server:

    Kopírovat ($ _ soubory ["UploadFile"] ["TMP_NAME"], "Uploads /". Basename ($ _ soubory ["UploadFile"] ["Name"]);

    V Linuxu je vše mnohem složitější - musíme vzít v úvahu přístupová práva k katalogu Uploads. S největší pravděpodobností v tomto případě funkce mkdir () Nebude to fungovat, protože nemáme právo napsat do adresáře DocumentRoot (obvykle / var / www / html nebo / httpd / html). Zaregistrujte se jako kořenový systém, vytvořte adresář nahrávání a změňte jeho vlastníka a přístupová práva takto:

    // Vytvořit katalog nahrávání

    // Nainstalujte název vlastníka Apache a jeho skupinu - také Apache:

    Chown Apache: Uploads Apache

    // rozlišení pro každého (777) + instalace upevňovacího bitu (1):

    Chmod 1777 Uploads.

    Velikost souboru může být omezena, pokud si přejete, můžete upravit soubor .htaccess a omezit přístup do adresáře pro nahrávání - určení nebo specifické uživatelé, které můžete přistupovat k adresářům nebo adresám IP.

    Nyní můžete nahrát soubory na server.

    Píšeme PHP skript ke stažení souborů na server


    // Katalog, ve kterém obdržíme soubor:
    $ uploaddir \u003d "./files/";
    $ Uploadfile \u003d $ uploaddir. Basename ($ _files ["Uploadfile"] ["Jméno"]);

    // Zkopírujte soubor z adresáře pro ukládání dočasného souboru:
    pokud (Kopírovat ($ _Files ["UploadFile"] ["TMP_NAME"], $ UploadFile))
    {
    echo. "

    Soubor je úspěšně stažen na server.

    " ;
    }
    jinak (echo. "

    Chyba! Nepodařilo se stáhnout soubor na server!

    "
    ; výstup; )

    // zobrazit informace o staženém souboru:
    echo. "

    Informace o souboru načteném na serveru:

    "
    ;
    echo. "

    Původní název staženého souboru: ". $ _Files ["UploadFile"] ["Jméno"]. "

    " ;
    echo. "

    MIME typ staženého souboru: ". $ _Files ["uploadfile"] ["typ"]. "

    " ;
    echo. "

    Velikost načteného souboru v bajtech: ". $ _Files ["velikost"] ["velikost"]. "

    " ;
    echo. "

    Jméno dočasného souboru: ". $ _Files ["uploadfile"] ["TMP_NAME"]. "

    " ;

    ?>

    Načítání více souborů lze implementovat, například různé hodnoty názvů pro vstupní značku.

    Poskytuje také schopnost automaticky získat informace organizované do řady několika současně stahovatelných souborů. Chcete-li takovou příležitost implementovat, použijte stejnou datovou syntaxi pole z formuláře HTML jako pro více políčko Zvolit a zaškrtávací políčko:


    Odeslat tyto soubory:






    V případě, že byl takový formulář odeslán, pole $ _files ["UserFile"], $ _files ["UserFile"] ["Jméno"] a $ _Files ["UserFile"] ["UserFile"] ["Size"] bude inicializována (v Stejným způsobem jako $ http_post_files pro PHP 4.1.0 a starší verze). Pokud je směrnice o konfiguraci Register_Globals nastavena hodnotou ON, budou také inicializovány přidružené globální proměnné. Každá z těchto proměnných bude numericky indexovaná pole odpovídajících hodnot pro přijaté soubory.

    Předpokládejme, že soubory /home/test/some.html a /Home/test/file.bin byly staženy. V tomto případě budou mít proměnnou "UserFile [" UserFile "] [" Name "] hodnotu SOME.HTML a hodnota $ _files [" UserFile "] proměnná [" Jméno "] je soubor.bin. Podobně variabilní $ _files ["UserFile"] ["Size"] bude obsahovat velikost souboru Některé.HTML a tak dále.

    Proměnné $ _files ["UserFile"] ["Jméno"], $ _Files ["UserFile"] ["TMP_NAME"], $ _Files ["UserFile"] ["SIZE"] a $ _FILES ["UserFile"] ["UserFile"] ["typ"] bude také inicializován.

    Závěr:

    Jak vidíte, není tak těžké organizovat stahování souborů na server. Je obtížnější poskytnout nezbytnou úroveň zabezpečení, protože načítání souborů na server mohou být použity útočníky na server. Jak poskytnout nezbytnou úroveň bezpečnosti, pracovat s nahráváním, viz.



    <<< Назад Obsah Vpřed \u003e\u003e\u003e
    Tam jsou stále otázky nebo něco nepochopitelného - vítejte na našich