Failide laadimine serverisse PHP abil. Näide failide allalaadimise serverisse (üleslaadimine) PHP-faili allalaadimiseks PHP-failis

Kindlasti sa tihti laadige saitidel erinevaid faile. Näiteks, uploaded avatarid foorumis, Fotod sotsiaalsete võrgustike, erinevate videote video hosts, vaid faile failide jagamise. Ja siin selle artiklis õppite kuidas failide üles laadida serverisse PHP-s. See on läbi PHP. Enamikul juhtudel rakendatakse seda.

Esiteks, mida õppida on see ise HTML-vormKui fail on asendatud, ei tohi siin olla päris normaalne HTML-kood Selline vorm:





Siin on võtmepunkt on atribuut " entüüp"Mis tähenduses" mitmeosalise / vormi andmed". Ei tööta ilma selleta.

"Kui me ikka veel faili alla laadida ja me liigume veidi erinevates olulistes punktides, mida tuleb arvesse võtta, muidu võib turvalisus mõjutada:

PRINT_R ($ _ failid);
?>

Selle tulemusena näete sisu. global kahemõõtmeline massiiv $ _files:

  • nimi. - allalaaditud faili nimi.
  • tüüp - MIME-TYPE Allalaaditav fail. See on ilmselt kõige olulisem parameeter turvalisuse jaoks. Ja alati failide vastuvõtmisel tuleb kontrollida MIME-TYPEVastasel juhul ei ole probleeme. Järgmises artiklis räägime sellest üksikasjalikumalt.
  • tmp_name. - füüsiline tee ajutisele failile. See on selles kohas, et fail on paigutatud ja alles siis me kanname seda teisele kohale. Tegelikult on fail juba laaditud ja me peame selle lihtsalt liigutama serveri soovitud kausta.
  • viga - veakood. Kui a 0 , Vead puuduvad.
  • suurus - allalaaditud faili suurus. See on ka sageli kasutatav valik ja seda tuleks ka kontrollida piirake allalaaditud failide suurust. Loomulikult on see suurus ise piiratud, kuid mis tahes piltide puhul on see suurus selgelt ülehinnatud (reeglina, ta 10 MB).

Ja kõik need parameetrid esinevad iga allalaaditava faili jaoks (millest igaüks neist on kahemõõtmelise massiivi massiiv. $ _Files.).

Nüüd lõpetame laadige failid PHP-sse serverisseJa selle eest kirjutame sellise koodi (""):

$ UPLOADFILE \u003d "Pildid /".$_ failid [" Somename "] [" NAME "];
Move_uploaded_file ($ _ faile ["Somename"] ["TMP_NAME"], $ uploadFile);
?>

See tähendab, et alguses täpsustame serveri allalaaditava faili tee. Siin tahame faili kataloogi panna " pildid"Sama nimega, mis oli enne faili. Ja funktsioon move_Uploaded_file () Me liigutame faili oma valitud kataloogi kataloogi oma ajutisest ladustamisest.

Pöörake tähelepanu, see on väga oluline! Nii kasutage koodi mingil juhul, vastasel juhul teie sait Ähvardab tõsist ohtu! Tegelikult saab hetkel alla laadida absoluutselt mis tahes käivitatavate failide, skriptide, Html pann Ja muud väga ohtlikud asjad. Seetõttu on vaja kontrollida allalaaditavaid faile serverisse väga hoolikalt. Ja nii me tegeleme järgmises artiklis. Kuna teema on väga oluline, siis soovitan teil tellida värskendusi, et mitte see artikkel jätta.

Sul on brauseris blokeeritud JavaScript. Laske JavaScript töötada saidi!

Failide laadimine serverisse

Lühike exours üleslaadimisel

Mis on failide üleslaadimine või miks ei tööta
kopeeri ("C: images \\ proovis.jpg", "http://mysite.ru/uploads/sample.jpg")

Isegi kui teil on teie käsutuses ainult üks arvuti, kus server ja tööjaam on joondatud, ärge unustage, et PHP kasutab kliendi / serveri tehnoloogiat. Fail, mida me tahame üles laadida, asub tavaliselt kliendi autos, st Kasutaja, tavaline saidi külastaja. Sihtkoht on server. Failiülekande protsessi tegemiseks vajame järgmist vormi:

Saada see fail:

Sellisel juhul peab teie PHP-i skripti URL-i täpsustama tegevusvaldkonnas, mis jätkab allalaaditud failide töötlemist. Varjatud MAX_FILE_SIZE väli peab eelnema failivaliku väljale ja sisaldama maksimaalset lubatud faili suurust baitides. Selle ülesanne on kontrollida faili suurust isegi seni, kuni fail saadetakse serverisse. See peaks kasutaja salvestama pika ja ebaõnnestunud allalaadimise faili serverisse ja liigse liikluse moodustamisele, kuid ei tohiks eriti tugineda sellele piirangule, sest see on selle ümber lihtne.

Mis juhtub siis, kui kasutaja valis oma kettale faili ja vajutas nuppu "Saada fail"? Brauser saadab faili serverisse, kus PHP tõlk asetab selle ajutise kataloogi, määrates selle juhusliku nime ja täidab tegevusvaldkonnas määratud skripti.

Kuidas peaks upload.php nägema?

$ UPLOADDIR \u003d "/ var / www / üleslaadimine /"; If (Move_uploaded_file ($ _ failid ["kasutajafile"] ["TMP_NAME"], $ Uploaddir. $ _files ["UserFile"] ["NAME"])) (Prindi "fail on kehtiv ja edukalt üles laaditud.";). Muidu (print "seal mõned vead!";)

Skripti kirjutamisel tekib loomulik küsimus: kuidas saada teavet allalaaditud faili kohta ja jõuda faili ise. Kui kasutate PHP versiooni 4.1.0 ja vanemat, siis on parem viidata globaalsele $ _files massiivile. Iga allalaaditud faili puhul sisaldab see hash massiivi järgmiste andmetega:

  • $ _Files ["UserFile"] ["NAME"] - algne faili nimi, näiteks kasutaja seda nägi, valides faili;
  • $ _Files ["UserFile"] ["tüüp"] - Näiteks MIME / tüüpi fail võib olla pilt / gif; See väli on kasulik salvestada, kui soovite allalaaditud failide allalaadimiseks liidese;
  • $ _Files ["UserFile"] ["Suurus"] - allalaaditud faili suurus;
  • $ _Files ["UserFile"] ["TMP_NAME"] - täielik tee ajutisele failile kettale;
  • $ _Files ["UserFile"] ["Viga"] - Alustades versioon 4.2.0, sisaldab veakoodi, mis on 0, kui operatsioon on edukalt läbinud.

PHP versiooni jaoks on alla 4.1.0, seda massiivi nimetatakse $ http_post_files. Ära unusta, et erinevalt $ _files, see massiiv ei ole Superglobal ja kui see juurdepääsu sellele, näiteks funktsiooni, on vaja selgesõnaliselt täpsustada globaalse $ http_post_files;

Kui täiendavaid muutujaid $ userfile_name, $ userfile_type, $ userfile_size, $ userfile_type, $ userfile_size, $ userfile_size, luuakse oma registris_globals \u003d edasi, ... Arvestades, et alates versioon 4.2.0, vaikeseaded Registreeri_globals \u003d Nende muutujate kasutamine ei ole soovitatav, isegi kui nad on määratletud. Parim viis saada teavet allalaaditud failide kohta on kasutada $ _files massiivi.

Et töötada allalaaditud failidega, on kõige parem kasutada sisseehitatud funktsioone IS_UPLAPLETED_FILE () ja Move_uploaded_file (), mis kontrollib, kas fail laaditakse vastavalt ja asetas vastavalt määratud kausta. Lisateavet käsitsi lehekülgede leiate. See ei ole vaja leiutada jalgratta ja töötada ajutiste failidega ise, kopeerige need, kustutada. See on juba teie jaoks ja teie jaoks tehtud.

Serveri häälestamine

Ma tegin kõik õigesti, kuid midagi ei tööta minu jaoks. Võib-olla mul on valesti konfigureeritud server?

Kui sa "tegid kõik õiged", kuid teie kood ei tööta või see toimib valesti, ärge kiirustage meeleheitele. Võib-olla probleem ei ole teie käes, vaid vale serveri seadetes. Siin on loetelu direktiividest, mis on seotud failide allalaadimisega:

Php.ini failis:

  • Kui soovite teada, kus teie php.ini asub, toimige
  • file_Uploads. - võime keelata või lubada faile allalaadimist tervikuna. Vaikimisi.
  • upload_max_filesize - Maksimaalne faili suurus, mida saab alla laadida. Kui teil on vaja töötada suurte failidega, muutke seda seadet. Vaikimisi 2m Ära unusta muuta post_max_size.
  • post_max_size - Postitaotlusel edastatud andmete ülaosa üldine piir. Kui teil on vaja töötada suurte failidega või saatke samal ajal mitu faili, muutke seda seadet. Vaikeväärtus on 8m.
  • upload_tmp_dir. - Ajutine kataloog serveris, millele kõik allalaaditavad failid paigutatakse. Kontrollige, millised õigused on selle vastu (kui teil on selles etapis raskusi, vaadake artikli lõpus selgitust). Sellise kataloogi peab olema ka kasutaja, mille all Apache toimub, peab olema ka õigus kirjutada sellele kataloogi. Kui töötate koos Open_Basediri piiranguga, mis on lubatud - siis ajutine kataloog peab olema sees. Sa ei pea hoolitsema oma puhastamise või unikaalsete nimede eest, PHP lahendab selle probleemi teile.

Faili httpd.conf.:

  • Kõigepealt veenduge, et kasutate Apache 1.3 veebiserverit (uusim versioon artikli kirjutamise ajal - 1.3.27). Kui kasutate Apache 2.0-d, peaksite dokumentatsioonist järgmist väljavõtet lugema:

    Ärge kasutage Apache 2.0 ja PHP tootmise keskkonnas ei Unixi ega Windows.

  • Kui saite sõnumi "Postita meetod ei ole allodeeritud", tähendab see, et peate otsima midagi sarnast järgmistele direktiividele ja kasutage võimalikult märksõna: Tellimus lubab, keelata kõik
  • Probleemid binaarfailide allalaadimisega - klassikaline küsimus "Miks failid üleslaadimisel võitlevad". Siin on lahendus Dima Borodiini pakutud otsusele (http://php.spb.ru): kataloogi, kus skript valetab, teha .htaccess faili, kus me kirjutame: Charsetdestable File httpd.conf. Lisa read: Charsetrecodemiftiforms off

Väikesed selgitused sellele retseptile: ülaltoodud probleem, kui serverisse laaditud arhiiv ei ole tasumata ja pilte ei kuvata, võib see tekkida asjaolu tõttu, et Vene Apache veebiserverit kasutatakse. CrameReseleble direktiiv keelab the Charset-töötlemise mooduli mooduli, st Selles kaustas asuvate failide allalaadimisel ei esine transcodingit. CharsetCodemiTIPTIPARTFORMS Direktiiv lülitub välja postimeetodiga edastatud andmete transcoding sisu-tüüpi: mitmeosalise / vormi andmete päisega. Need. Sellise seadistusega edastatud binaarsed andmed jäetakse algses vormis ja kõik ülejäänud saidi täitmine toimub vastavalt praeguste serveri seadete järgi.

Kuid samal ajal võivad tekkida tüsistused: olge valmis asjaolu, et mõnel juhul on taotluste tekstid osad ise välja paista. See on see, mida dokumentatsiooni selle kohta öeldakse:

Kasutage CharsetrecodeMultipartforms Direktiivi, mis ilmus PL23, kuid teil on ikka veel käsitsi teksti osa osad. Selleks saate kasutada Vene Apache API-d saadaval teistes moodulites või Vene Apache Perl API-l Saadaval mod_perlilt.

Kodeerimismäära üks näiteid leiate siit: http://tony2001.phpclub.net/detect_charsets/detect.phps

Viimane dokumentatsioon Vene Apache on oma ametlikul veebilehel: http://apache.lexa.ru/.

Ärge unustage, et pärast mis tahes konfiguratsiooni muutmist peate veebiserveri taaskäivitama.

Samuti saate konfigureerida Apachi parameetreid.Htaccess:

Php_value upload_max_filesize 50m php_value post_max_size 50m

Lisafunktsioonid

Mitme faili laadimine samal ajal

Näide mitu faili allalaadimisvormist:

Saada need failid:


Ja ärge unustage suurendada post_max_sizeKui palju faile peaks olema

Automaatne allalaadimine failid serverisse

Te ei tohiks unustada, et kasutaja ketta failid on konfidentsiaalsed andmed, millele ei ole JavaScript ega nii palju PHP-l madalat suhet. Kuni kasutaja valis faili abiga Ükskõik milline temaga töötamine võib minna ja kõne. Ja ärge unustage, et see väli sisendvälja on väärtuse atribuut salvestamise eest kaitstud.

MySQL-andmebaasi failide salvestamine

Kui olete kogutud allalaaditavate failide salvestamiseks andmebaasis peate meeles pidama järgmisi punkte:

  • Peate kasutama Blobi välja
  • Enne andmebaasi paigaldamist ärge unustage taotleda MySQL_ESCAPE_STRING () stringi suhtes
  • Faili kuvamisel peate täpsustama sisu / tüübi päise

Pidage meeles, et skript kuvab teie HTML-i ei ole mingil moel ühendatud skriptiga, mida pilt peab välja tooma. Need peavad olema kaks erinevat rakendust.

Piltide salvestamine andmebaasis ei ole hea stiil. Andmebaasis on palju mugavam ainult pildifailide salvestamiseks.

Pildi omaduste saamine.

Kui teil on ülesanne kontrollida pildi tüüp või suurus enne faili allalaadimist serverisse, siis on vaja Getimagesize () funktsiooni. Argumendina aktsepteerib see plaadi faili nime ja tagastab massiivi, mille esimesed kaks elementi on vastavalt laius ja kõrgus, kolmas on kujutise tüüp. Kui määratud failist õiget pilti ei ole võimalik lugeda, siis naaseb funktsioon vale.

Vene keele nimi failide laadimine

Serverifaili allalaadimisel peate kontrollima oma algseid nimesid "mittestandardsete" tähemärkide olemasolu (näiteks vene tähed). Nende kohaloleku korral on vaja asendada. Algne faili nimi võib leida $ _files ["UserFile"] ["NAME"] muutuja. Kuidas laadida venekeelse stringi, et leiti leida PHP näidetest.

Laadi alla Olekunäit (Progress Bar)

Tuleb meeles pidada, et kuni fail on täielikult allalaaditud, ei saa PHP toimida ega faili suurust või selle laadimise protsenti. Ainult siis, kui fail on PHP serveris juba võimalik, saab see teavet juurde pääseda. Kui teil on vaja endiselt sellist võimalust rakendada, kasutage Java-Applet.

Õigused failidele

Serveri õigustega seotud probleemid (UPLOAD_TMP_DIR)

Unix-tüüpi operatsioonisüsteemides, iga kaust, fail, on link kehtestatud õiguste täitmiseks. Nad võivad välja tulla nagu RWX-RW-R- või number 754.

Faili või kataloogi kättesaadavus sõltub kasutajatunnusest ja grupi identifikaatorist, kus see siseneb. Mode tervikuna kirjeldatakse kolme järjestuse, kolme tähte poolest:

Omanik Muu Grupp (U) (g) (O) RWX RWX RWX

Siin omaniku, liikmete rühma ja kõigil teistel kasutajatel on õigused lugeda faili, kirjutada IT ja selle täitmise. Õigused - mis tahes mõttekas kombinatsioon järgmistest tähedest:

r ÕIGE lugeda. (neli)
W õigus salvestada. (2)
x Õigus täitmisele (otsing kataloogi). (üks)

  • Paigaldage kasutajakataloogi omanik, kelle atraktsioonidega tegeleb Apache poolt. Seda leiate aadressilt httpd.conf faili või vaadates nimekirja protsesside serveris. Kataloogiõigused peaksid olema 700 (RWX ------).
  • Sõltumata sellest, kes kataloogi omanik, luua õigused 777 (RWXRWXRWX).

    Näide piltide allalaadimise rakendamisest serverisse.

    $ max_image_width \u003d 380; $ max_image_height \u003d 600; $ max_image_size \u003d 64 * 1024; $ kehtib_typs \u003d massiiv ("gif", "jpg", "png", "jpeg"); Kui (ISSTE ($ _ faile ["kasutajafile"]))) (kui (IS_UPLATED_FILE ($ _ failid ["UserFile"] ["TMP_NAME"]))) ($ FileName \u003d $ _files ["UserFile"] ["TMP_NAME"] ; $ Ext \u003d substr ($ _ failid ["UserFile"] ["NAME"], 1 + StrRPOS ($ _ Files ["UserFile"] ["NAME"], ".")); IF (failize ($ failinimi "]); )\u003e $ max_image_size) (ECHO "Viga: faili suurus\u003e 64k.";) ENDIF (! IN_ARRAY ($ EXT, $ PITHE_TYPES)))) (ECHO "Viga: kehtetu failitüüp.";) Else ($ suurus \u003d gettimages ($ Failinimi); kui (($ suurus) && ($ suurus< $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 "
    Saada see fail:
    "; }
  • Meie artiklis kaalume näiteks PHP-faili loomise näidet serveri allalaadimise skripti allalaadimiseks. Meie lihtne faili allalaadimise näide on 2 faili: vorm (vorm.html), PHP-faili allalaadimise skript (uploaderi.php).

    Nüüd me analüüme kõike üksikasjalikult. Esiteks analüüsige vorm.html vormifaili:


    Nagu näete seda lihtsat HTML-koodi, pole siin midagi keerulist, ainus, kui vorm annab faile serverisse, siis peab atribuut olema registreeritud enctype \u003d "multipart /vormi-andmed ".

    Meie vorm näeb välja selline:

    NäidePHP faili allalaadimine skript

    Nüüd me näitame selle välja PHP-failiga, mis laadivad failid serverisse. Allpool on selle lähtekood:

    // Kui fail on paigutatud $ sihte_path \u003d 'Uploaded_files / "; / * Lisage oma sihttee algne failinimi. Tulemus on" üleslaaditud_files / fileenme.extension "* / $ TARGET_PATH \u003d $ TARGET_PATH. Basename ($ _ Failid ["Fail"] ["NAME"]); IF (Move_uploaded_File ($ _ failid ["fail"] ["TMP_NAME"] ["TMP_NAME"], $ Target_Path)) (Echo "faili". Basename (File Failid ["fail") "] [" NAME "])." On üleslaaditud ";) muidu (ECHO" Faili üleslaadimisel ilmnes viga, proovige uuesti! ";)

    Kuidas PHP faili alla laadida skripti?

    uploaderi.php on lihtne PHP-fail alla laadida skripti serverisse, mis laadivad alla meie failid konkreetse saidi kataloogi, mis on määratud $ sihtmärgi_path \u003d "Uploaded_files /" string;

    Noh, iseenesest teeme elementaarse väljundi sõnumite kasutamisel, kui / muidu oli selge, meie fail on laaditud või mitte.

    Hacker häkkimise kaitse faili allalaadimisel

    Me kaalume mitte ainult kaitset häkkeri häkkimise, vaid ka teiste soovimatute probleemide tõttu, mis tulenevad failide allalaadimisel serverisse.

    PHP File Shell

    See on esimene probleem, mis on seotud failide allalaadimisega serverisse. Kui allalaadimisfail on PHP kesta ja see ei tähenda, et selle pikendamine on PHP. See võib olla vaade Image.jpg (.gif, .png ...). Aga sees näeb välja selline:

    Mõned käsitöölised võivad ka serveri käskude käivitada URL-i surfamise abil:

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

    Kaitsemeetod:

    Kaitsta, saate rakendada MIME faili kontrollimist. Allpool vt näide:

    Kui ($ _ failid ["fail"] ["tüüp"]! \u003d "Image / GIF") (Echo "Vabandame, me ainult kõik üleslaadimise GIF-pilte"; väljumine;)

    See PHP koodi tükk kontrollib, kas fail on allalaaditav GIF-fail. Sisestage see kood enne PHP-faili allalaadimise skripti. Loomulikult saate muuta kontrolli JPG, PNGI muud vajalikud failid.

    See on tõde öelda ja seda kaitsemeetodit saab mööda minna, kui saadate päise päise, MIME juhistega. Selleks on vaja kontrollida kättesaadavust Sildid allalaaditav faili.

    Allalaaditud faili suuruse piiramine

    Võib esineda ka probleeme suurte failidega, mis hõivavad teie kettaruumi. Selleks kirjutage allalaaditud faili suuruse piirang.

    Seda saab teha selle vormi abil, selle kasutamisel peate HTML-vormi kontekstis lisama järgmine rida:

    See peidetud sisendvälja piirab allalaaditava faili suurust. Või saate kontrollida PHP-tööriistade faili suurust.

    Kirjutage O.pHP-faili allalaadimine skript võib olla pikk, kuid me oleme juba demonteeritud failide allalaadimise põhiprintsiip. Seega, kui kellelgi on rohkem küsimusi, paluge neil kommentaarides.

    Täna, failide allalaadimise teenus serverisse (hosting) leitakse kõikide sotsiaalsete võrgustike saitide, bülletäänplaatide, dating sites jne. Selle sisuliselt võimaldab külastaja veebiressursile oma faile avaldada (fotod, dokumendid) internetis.

    Selle teenuse osutamisel on üks oluline miinus. Fakt on see, et võimaldades faili oma serverisse alla laadida, paigaldame me, nagu see oli, paigaldame uks, mille taga on pidev juhtimine vajalik. Kuna külastaja failis ei pruugi olla mitte ainult kasulikku teavet, vaid ka viiruse koodi, mis võimaldab hiljem ründajatel oma serveri valdusse võtta. Arvestades seda miinus, peate enne serverisse allalaadimist faile hoolikalt kontrollima.

    Aga ma ei hirmuta sind, kuid ma pigem ette kujutada, et teie tähelepanu juba valmis funktsiooni (PHP-skript) failide kontrollimiseks ja allalaadimiseks serverisse. Funktsioon on 100% töötav. Ma kasutan seda minu saitidel. See funktsioon on kirjutatud pildifailide (fotode) allalaadimiseks formaadis.jpg, .gif, .png. Aga kui soovite, saate teha muudatusi PHP-skripti kohandamiseks teie vajadustele.

    PHP-skriptis rakendatakse kahte kontrolli:

    1. kuna hoster piirab allalaaditud faili suuruse (selle materjali kirjutamise ajal, on mul 8 MB limiit minu hosting), seejärel on vaja maksimaalse suuruse kontrollimine;
    2. faililaiendi kontrollimine võimaldab enne allalaadimist eemaldada tarbetuid faile.

    Loodan, et funktsioonikood on piisavalt selgitatud, et tegeleda serveri allalaadimisfailiga. Aga kui teil on küsimusi, on mul hea meel vastata kommentaaridesse.

    Nüüd, kuidas seda praktiliselt rakendada

    Paneme PHP koodi funktsiooni eraldi faili: Funktsioon.php ja asetage see juurekataloogi serverisse.

    Ja luua HTML-fail, kus foto allalaadimisvormi postitamiseks: index.html

    upload.php - failivormi käitleja
    Nimi \u003d "Nupp" - nupu nimi, kui klõpsate serverisse faili allalaadimise funktsiooni

    Mitme faili laadimine

    Nüüd me analüüsime juhtumi, kui teil on vaja alla laadida mitu faili serverisse.
    Selleks on meil vaja function.php faile update.php ja index.html teha mõned muudatused.





    Võib-olla on see kõik, mida vajate teenuse rakendamiseks kasutajafaili allalaadimiseks serverisse (hosting).

    Teine funktsioon, mis on tihedalt seotud graafiliste failide allalaadimisega (fotod) on funktsioonide suuruse muutmine:

    Mitmeosalise vormid

    • Postiteenuste veebi ierfaces, mis võimaldavad teil lisada kirjale taotluse (lisage) ja selleks peate esmalt faili serverisse alla laadima ja alles pärast seda, kui seda saab kirja lisada;
    • Interaktiivsed fotogaleriid ja fotoalbumid, mis ei saa eksisteerida ilma failide allalaadimismehhanismi ilma failideta;
    • Tasuta tarkvaraportaalid, mida kasutatakse erinevate programmide failide vahetamiseks jne.

    Faili allalaadimine serverisse viiakse läbi mitmeosalise kirjelduse abil, kus on failide laadimisvälja. Anotüübi parameeter näitab mitmeosalise / vormi andmeid:



    See näeb välja nagu antud mitmeosaline vorm, mis näeb välja nagu (saate proovida näha mitmeosalise vormide tulemust, allalaadimist mõne väikese faili serverisse):

    Mitmeosalise vormid kasutavad tavaliselt ülekandemeetodit. Nagu eelmisest näitest näha, on sellel vormil kaks väljad:

    • Faili valimise väli allalaadimiseks ;
    • VALDKOND, MIS SÜSTEEMI MÄRKUS, MIS ON VAJALIK .

    Mitmeosalise vormi töötlemine

    Enne mitmeosalise vormi töötlemise skripti kirjutamise jätkamist peate redigeerima konfiguratsioonifaili php.ini. Failide allalaadimiseks serverisse.

    PHP php.ini konfiguratsioonifailil on serverisse failide allalaadimisega seotud kolm parameetrit:

    • file_Uploads \u003d On - võimaldab teil faile serverisse HTTP-protokolli kaudu alla laadida;
    • uPLOAD_TMP_DIR \u003d / TMP - Määrab kataloogi allalaaditud failide ajutiseks salvestamiseks;
    • uPLOAD_MAX_Filesize \u003d 2M - määrab allalaaditud failide maksimaalse summa.

    Kui teie veebiserver töötab Linuxi operatsioonisüsteemi käivitamisel, peate teenuse taaskäivitama:

    teenuse httpd taaskäivitamine

    Kuidas PHP käepide Multipart-vormid? Pärast faili saamist säästab see selle UPLOAD_TMP_DIR ajutise kataloogi, failinimi valitakse juhuslikult. Siis loob see superglobali arhiivi $ _files neli muutujat. See massiiv sisaldab teavet allalaaditud faili kohta.

    Allalaaditud failide jaoks määratletud muutujad sõltuvad PHP-versioonist ja praegusest konfiguratsioonist. Superglobal $ _filey massiiv on saadaval PHP 4.1.0. Juhul konfiguratsioonirektoraat Registreeri_globals määrab väärtus pEAL.Lisaks deklareeritakse muutujatele sobivate nimedega. Alates versioonist 4.2.0-st on registri_globals'i vaikeväärtus valik väljas.

    Allpool on esitatud $ _filesi massiivi sisu meie eeskuju jaoks. Pange tähele, et eeldatakse, et ta kasutab failivaliku väljale üleslaadimisfaili, vastavalt ülaltoodud mitmeosalisele vormile. Muidugi, nimi valdkonnas võib olla mõni.

    • $ _Files ["UPLOADFILE"] ["NAME"] - failinimi enne selle saatmist serverisse, näiteks Pict.gif;
    • $ _Files ["UploadFile"] ["Size"] - saadud faili suurus baitides;
    • $ _Files ["UploadFile"] ["Type"] - MIME tüüpi vastuvõetud faili (kui brauser suutis seda määrata), näiteks: pilt / gif, pilt / png, pilt / jpeg, tekst / html;
    • (Nii et me nimetame faili allalaadimisväljale) - sisaldab ajutise kataloogi faili nime, näiteks: / TMP / PHPV3B3QY;
    • $ _Files ["UPLOADFILE"] ["Viga"] -Veakood, mis võib tekkida faili laadimise ajal. Võti ["Viga"] See lisati PHP 4.2.0-le. Sobivate veakoodidega saate ennast tutvuda

    Pärast skripti lõpetamist kustutatakse ajutine fail. See tähendab, et me peame selle kopeerima teise kohale, kuni skript on lõpetatud. See tähendab, et faili allalaadimise töö stsenaariumi algoritm on serverisse allalaadimine:

    Kui vajutatakse nuppu "Esita", laaditakse fail juba serverisse alla ja selle nimi on $ _files ["UPLOADFILE"] ["NAME"] muutuja. Sel juhul peab skript kopeerima kohe faili nimega $ _Files ["UPLOADFILE"] ["TMP_NAME"] Mõnele kataloogile (peate selle kataloogi kirjutama).

    Failide kopeerimine toimub funktsiooni järgi kopeeri () :

    Kasutage ainult koopia () koopia () funktsiooni ja mitte liikumist, sest:

    • Ajutine fail eemaldatakse automaatselt;
    • Kui ajutine kataloog on teises meedias, kuvatakse veateade.

    Oletame, et peame faili alla laadima üleslaadimiste kataloogi, mis asub veebiserveri juurkataloogis (Documeroot kataloogis).

    // Igaks juhuks looge kataloog. Kui ta on juba loodud,
    // Veateade Me ei näe, sest me kasutame @ operaatorit:

    @mkdir ("Üleslaadimine", 0777);

    // Kopeeri faili üles / tmp üleslaadimises
    // Faili nimi on sama, mis enne serverisse saatmist:

    Kopeeri ($ _ failid ["UploadFile"] ["TMP_NAME"], "Üleslaadimine /". Basename ($ _ faile ["UPLOADFILE"] ["NAME"]));

    Linuxis, kõik on palju keerulisem - peame võtma arvesse juurdepääsuõigusi üleslaadimise kataloogi. Tõenäoliselt sel juhul funktsioon mkdir () See ei tööta, sest meil ei ole õigust kirjutada Documeroot kataloogile (tavaliselt / var / www / html või / kodu / httpd / html). Registreeru rootisüsteemina, looge üleslaadimise kataloog ja muutke oma omaniku ja juurdepääsuõigusi järgmiselt:

    // loo üleslaadimise kataloogi

    // Paigaldage Apache omaniku ja selle grupi nimi - ka Apache:

    Chown Apache: Apache üleslaadimine

    // Kirjutage eraldusvõime kõigile (777) + kinnitustaseme paigaldamine (1):

    Chmod 1777 üleslaadimine.

    Faili suurus võib olla piiratud, kui soovite, saate muuta .htaccess faili ja piirata juurdepääsu üleslaadimiste kataloogi - täpsustada või konkreetseid kasutajaid, kes saavad juurdepääsu kataloogi või IP-aadressid.

    Nüüd saate serverisse faile üles laadida.

    Kirjutame PHP skripti allalaadimisfaile serverisse


    // Kataloog, milles me faili saame:
    $ uploaddir \u003d "./files/";
    $ UPLOADFILE \u003d $ UPLOADDIR. BaseName ($ _files ["UploadFile"] ["NAME"]);

    // Kopeeri faili ajutise faili salvestamise kataloogi:
    kui (koopia ($ _files ["UploadFile"] ["TMP_NAME"], $ UPLOADFILE))
    {
    eCHO. "

    Fail on edukalt alla laadida serverisse.

    " ;
    }
    muidu (kaja "

    Viga! Faili serveri allalaadimine ebaõnnestus!

    "
    ; Välju; )

    // Näita allalaaditud faili kohta teavet:
    eCHO. "

    Teave serverisse laaditud faili kohta:

    "
    ;
    eCHO. "

    Allalaaditud faili algne nimi: ". $ _Files ["UPLOADFILE"] ["NAME"]. "

    " ;
    eCHO. "

    Allalaaditud faili MIME tüüp: ". $ _Files ["UploadFile"] ["tüüp"]. "

    " ;
    eCHO. "

    Laetud faili suurus baitides: ". $ _Files ["suurus"] ["suurus"]. "

    " ;
    eCHO. "

    Ajutine failinimi: ". $ _Files ["UploadFile"] ["TMP_NAME"]. "

    " ;

    ?>

    Mitme faili laadimine saab rakendada näiteks sisendmärgise erineva nime väärtuste abil.

    Samuti nähakse see ette võime automaatselt saada teavet mitmesuguse samaaegselt allalaaditava faili massiivi. Sellise võimaluse elluviimiseks kasutage HTML-i vormi sama andmete süntaksit mitmekordse valimise ja ruudukujuliste väljade puhul:


    Saada need failid:






    Kui selline vorm on saadetud, massiivid $ _files ["UserFile"], $ _files ["UserFile"] ["NAME"] ja $ _Files ["UserFile"] ["suurus"] käivitatakse ( samamoodi nagu $ http_post_files PHP 4.1.0 ja varasemate versioonide jaoks). Kui Register_globals konfiguratsiooni direktiivi määrab väärtus, seotud globaalsete muutujate ka käivitatakse. Kõik need muutujad on vastuvõetud failide vastavate väärtuste arvuliselt indekseeritud massiivi.

    Oletame, et allalaaditud, et /home/test/some.html ja /home/test/file.bin failid laaditi alla. Sellisel juhul on $ _files ["kasutajafail" ["NAME"] muutuja on mõned.html väärtus ja $ _files ["UserFile"] muutuja ["NAME"] on fail.bin. Samamoodi muutuja $ _files ["kasutajafile"] ["suurus"] sisaldab faili suurust mõned.html ja nii edasi.

    Muutujad $ _files ["UserFile"] ["NAME"], $ _Files ["UserFile"] ["TMP_NAME"], $ _Files ["UserFile"] ["Suurus"] ja $ _files ["UserFile"] ["tüüpi"] käivitatakse ka.

    Järeldus:

    Nagu näete, ei ole nii raske failide allalaadimise korraldamine serverisse korraldada. Vajaliku turvalisuse taset on raskem pakkuda, kuna ründajate serverisse saab kasutada failide laadimist serverisse. Kuidas pakkuda vajalikku turvalisuse taset, töötavad üleslaadimisega, vt.



    <<< Назад Sisu Edasi \u003e\u003e\u003e
    On veel küsimusi või midagi arusaamatut - Tere tulemast meie