Učitavanje datoteka na poslužitelj pomoću PHP-a. Primjer preuzimanja datoteka na poslužitelj (upload) u PHP kako preuzeti PHP datoteku

Sigurno ste često preuzmite različite datoteke na web lokacijama. Na primjer, preneseni avatari na forumu, Fotografije na društvenim mrežama, raznim video zapisima na video domaćinima, samo datoteke na dijeljenju datoteka. I ovdje u ovom članku ćete naučiti kako prenijeti datoteke na poslužitelj u PHP-u. Prolazi kroz PHP. U većini slučajeva to se provodi.

Prije svega, šta naučiti je da je ona HTML obrazacu kojem je datoteka supstituirana ne smije biti sasvim normalna, evo primjera HTML kod Takav oblik:





Ključna točka ovdje je atribut " enctype"Sa značenjem" višestruki / oblici podataka". Neće raditi bez njega.

"U kojem još uvijek ne preuzimamo datoteku, a mi ćemo malo prenijeti različite važne točke koje se moraju uzeti u obzir, inače sigurnost može utjecati na:

Print_r ($ _ datoteke);
?>

Kao rezultat toga, vidjet ćete sadržaj. globalni dvodimenzionalni niz $ _Files:

  • ime. - Naziv preuzete datoteke.
  • vrsta - Mime tip Datoteka za preuzimanje. Ovo je možda najvažniji parametar za sigurnost. I uvijek prilikom primanja datoteka moraju biti provjerene Mime tipInače nema problema. U sljedećem članu ćemo o tome detaljnije razgovarati o tome.
  • tmp_name. - Fizički put do privremene datoteke. Na ovom mjestu je datoteka postavljena, a tek tada ga nosimo na drugo mjesto. U stvari, datoteka je već učitana, a mi ga moramo samo premjestiti u željenu mapu na poslužitelju.
  • greška - kod greške. Ako a 0 , Nema grešaka.
  • veličina - Veličina preuzete datoteke. Ovo je takođe često korištena opcija, a treba ih provjeriti i ograničite veličinu preuzetih datoteka. Naravno, ova veličina je, međutim, ograničena za bilo koje slike, ovu veličinu je jasno precijenjena (u pravilu on 10 MB).

I svi su ovi parametri prisutni za svaku datoteku za preuzimanje (od kojih je svaka potraživanje u dvodimenzionalnom nizu. $ _Files.).

Sada završimo sa preuzmite datoteke na poslužitelju u PHP-uA za to ćemo napisati takav kod (""):

$ uploadfile \u003d "Images / ".$_ datoteke [" Somename "] [" Ime "];
Move_uploaded_file ($ _ datoteke ["Somename"] ["tmp_name"], $ uploadfile);
?>

To je, u početku ćemo odrediti put do datoteke za preuzimanje na poslužitelju. Ovdje želimo staviti datoteku u direktorij " slike"Sa istim imenom koji je bio prije datoteke. I funkcija move_uploaded_file () Premjestiti datoteku u direktorij svog odabranog direktorija iz njegovog privremenog skladištenja.

Međutim, obratite pažnju, vrlo je važno! Dakle, koristite kôd ni u kojem slučaju, u suprotnom na vašoj web lokaciji pretiće ozbiljnu opasnost! U stvari, trenutno se može preuzeti apsolutno sve: bilo koje izvršne datoteke, skripte, Html pan I druge vrlo opasne stvari. Stoga je potrebno provjeriti datoteke za preuzimanje na server vrlo pažljivo. I tako ćemo se baviti u sljedećem članku. Budući da je tema vrlo važna, tada vam savjetujem da se pretplatite na ažuriranja, kako ne biste propustili ovaj članak.

Imate javascript blokiran u vašem pretraživaču. Dopustite JavaScript-u da radi na lokaciji!

Učitavanje datoteka na server

Kratki egzaurs u prijenosu

Šta je datoteke za prijenos ili zašto ne radite
kopiraj ("C: \\ image \\ uzorak.jpg", "http://mysite.ru/uploads/sample.jpg")

Čak i ako na raspolaganju imate samo jedan računar na kojem se poslužitelj i radna stanica poravnaju, ne zaboravite da PHP koristi tehnologiju klijenta / servera. Datoteka koju želimo učitati obično se nalazi na automobilu klijenta, I.E. Korisnik, običan posjetitelj mjesta. Destinacija je poslužitelj. Da bismo napravili postupak prijenosa datoteke, potreban nam je sljedeći obrazac:

Pošaljite ovu datoteku:

U ovom slučaju, URL vaših php skripta mora biti naveden u području akcije, što će i dalje obrađivati \u200b\u200bpreuzete datoteke. HIDDEN MAX_FILE_SIZE polje mora prethoditi polje za odabir datoteke i sadrže maksimalnu dopuštenu veličinu datoteke u bajtovima. Njegov zadatak je provjeriti veličinu datoteke čak i dok se datoteka ne pošalje na server. Korisnik bi trebao sačuvati od dugog i neuspješnog preuzimanja datoteke na server i stvaranje viška prometa, ali ne bi se trebalo posebno oslanjati na ovo ograničenje, jer je lako zaobići.

Što se događa kada korisnik odabere datoteku na svom disku i pritisnuo tipku "Pošalji datoteku"? Preglednik šalje datoteku na poslužitelj gdje ga prevodilac php postavlja u njegov privremeni direktorij dodjeljujući ga nasumičnim imenom i izvršava skriptu navedenu u polju Action.

Kako bi trebalo da učitam.php izgleda?

$ uploaddir \u003d "/ var / www / uploads /"; Ako (potez_uploaded_file ($ _ datoteke ["userfile"] ["tmp_name"], $ uploaderdir. $ _Files ["userfile"] ["naziv"])) (ispis "datoteka je valjana i uspješno je prenesena.";) Drugo (ispisati "tamo neke greške!";)

Prilikom pisanja skripte nastaje prirodno pitanje: kako dobiti informacije o preuzetom datoteku i dostići sam samu datoteku. Ako koristite PHP verziju 4.1.0 i starije, bit će najbolje da se uputite na Global $ _Files nizu. Za svaku preuzetu datoteku sadrži hash niz, sa sljedećim podacima:

  • $ _Files ["userfile"] ["ime"] - originalno ime datoteke, poput korisnik vidjelo je, odabir datoteke;
  • $ _Files ["userfile"] ["tip"] - Mime / Type File, na primjer, može biti slika / gif; Ovo polje je korisno za spremanje ako želite pružiti sučelje za preuzimanje preuzetih datoteka;
  • $ _Files ["userfile"] ["Veličina"] - Veličina preuzete datoteke;
  • $ _Files ["userfile"] ["tmp_name"] - puni put do privremene datoteke na disku;
  • $ _Files ["userfile"] ["Greška"] - Počevši od verzije 4.2.0, sadrži kôd greške koji je 0 ako je operacija uspješno prošla.

Za PHP verziju ispod 4.1.0, ovaj se niz naziva $ http_post_files. Ne zaboravite da, za razliku od $ _files, ovaj niz nije superglabalni i pri tome, na primjer, iz funkcije je potrebno izričito odrediti globalni HTTP_post_files;

Ako su dodatne varijable $ userfile_name, $ userfile_type, $ userfile_type, $ userfile_type, bit će kreirana u postavkama vašeg registra_globals \u003d uključena, ... koja počinju s verzijom 4.2.0, zadane postavke registar_globals \u003d Isključeno korištenje ovih varijabli se ne preporučuje, čak i ako su definirane. Najbolji način za dobivanje informacija o preuzetih datoteka je korištenje matrice $ _Files.

Da biste saradili sa preuzetim datotekama, najbolje je koristiti ugrađene funkcije IS_Uploaded_file () i move_uploaded_file (), koji provjeravaju da li je datoteka učitana i postavljena u navedenu mapu, respektivno. Detaljnije informacije možete pronaći na ručnim stranicama. Nije potrebno izmisliti bicikl i sami raditi sa privremenim datotekama, kopirajte ih, izbrisati. Već je učinjeno vama i za vas.

Podešavanje servera

Učinio sam sve u redu, ali nešto mi ne radi. Možda imam pogrešno konfiguriran server?

Ako ste "učinili sve u pravu", ali vaš kod ne radi ili djeluje pogrešno, ne žurite u očaj. Možda problem nije u vašim rukama, već u pogrešnim postavkama servera. Ovdje je popis direktiva koji se odnose na preuzimanje datoteka:

U datoteci php.ini:

  • Ako želite znati gdje se nalazi vaš php.ini, izvedite
  • file_uploads. - Sposobnost zabrane ili dozvoljavanja preuzimanja datoteka u cjelini. Zadano uključeno.
  • upload_max_filesize - Maksimalna veličina datoteke koja se može preuzeti. Ako trebate raditi sa velikim datotekama, promijenite ovu postavku. Prema zadanim postavkama, 2m Ne zaboravite da promijenite post_max_size.
  • post_max_size. - Opća granica na vrhu podataka koji se prenosi u post zahtjevu. Ako trebate raditi sa velikim datotekama ili poslati više datoteka istovremeno, promijenite ovu postavku. Zadana vrijednost je 8m.
  • upload_tmp_dir. - Privremeni direktorij na poslužitelju koji će se postaviti svi datoteke za preuzimanje. Provjerite koja su prava postavljena na njemu (ako imate poteškoća u ovoj fazi, pogledajte objašnjenje na kraju članka). Takav direktorij mora imati i korisnika pod kojim se obavlja Apache, mora postojati i pravo pisati u ovaj direktorij. Ako radite sa Open_basedir Ograničivanjem - tada mora biti unutrašnji privremeni direktorij. Ne morate se brinuti o njenom čišćenju ili jedinstvenim imenima, PHP rješava ovaj problem za vas.

U datoteci httpd.conf.:

  • Prije svega, provjerite da li koristite Web server Apache 1.3 (najnovija verzija u vrijeme pisanja članka - 1.3.27). Ako koristite Apache 2.0, trebali biste pročitati sljedeći odlomak iz dokumentacije:

    Ne koristite Apache 2.0 i PHP u proizvodnom okruženju ni na UNIX-u ni na Windows-u.

  • Ako ste primili poruku "Post metoda nije dodijeljena", to znači da morate potražiti nešto slične sljedećim direktivama i koristiti ključnu riječ Dopuštanja: Naručite, negirajte dozvoliti od svih
  • Problemi s preuzimanjem binarnih datoteka - klasično pitanje "Zašto se datoteke bore pri učitavanju". Evo rješenja za odluku koju je predložio Dima Borodin (http://php.spb.ru): u direktoriju gdje skripta nalazi, napravite .htaccess datoteku u kojoj pišemo: na koje se navodimo na datoteku httpd.conf. Dodajte redove: Charsetrecodemultipartforms off

Mala objašnjenja, na ovaj recept: Gore navedeni problem kada se arhiv učitaju na poslužitelj nisu neplaćeni i slike se ne prikazuju, može se pojaviti zbog činjenice da se koristi ruski Apache Web server. CHARSETDISABLE DIREKTIVA Onemogućuje modul modula za obradu naklade, I.E. Ne transkodiranje Kada preuzimate datoteke koje se nalaze u ovoj mapi neće se pojaviti. Direktiva CharsetreCodeMultipartForcs isključuje transkodiranje podataka koje se prenose post metodom sa sadržajem tip: višestruko / zaglavlja podataka. Oni. Binarni podaci koji se prenose s takvim postavkama ostat će u originalnom obliku, a svi ostatak punjenja web lokacije reproducirat će se u skladu s trenutnim postavkama servera.

Ali istovremeno mogu nastati komplikacije: Budite spremni za činjenicu da u nekim slučajevima tekstualni dijelovi zahtjeva morat ćete se oporaviti. To je ono što se kaže o tome:

Upotrijebite Direktivu CharsetreCodeMultipartForcs, koji se pojavio u PL23, ali još uvijek morate obratiti ručno dijelove tekstualnog dijela. Da biste to učinili, možete koristiti ruski Apache API dostupni u drugim modulima ili ruskim Apache Perl API dostupnim iz Mod_perl.

Jedan od primjera definicije kodiranja možete pronaći ovdje: http://tony2001.phpclub.net/detect_charset/detect.phps

Najnovija dokumentacija o ruskom Apacheu nalazi se na službenoj web stranici: http://apache.lexa.ru/.

Ne zaboravite da nakon bilo kakve promjene konfiguracije morate ponovo pokrenuti svoj web server.

Možete konfigurirati i parametre apacha koristeći.htaccess:

Php_value upload_max_filesize 50m php_value post_max_size 50m

Dodatne funkcije

Učitavanje više datoteka istovremeno

Primjer za preuzimanje obrasca nekoliko datoteka:

Pošaljite ove datoteke:


I ne zaboravite da se povećate post_max_size.Ako su mnoge datoteke navode

Automatsko preuzimanje datoteka na server

Ne biste trebali zaboraviti da su datoteke na korisničkom disku povjerljive informacije kojima ni javascript ni toliko više PHP nemaju nisku vezu. Dok korisnik nije odabere datoteku uz pomoć Bez obzira na to što radi s njim može ići i govoriti. I ne zaboravite da je ovo polje unosa polja vrijednosti vrijednosti zaštićen od snimanja.

Skladištenje datoteka u MySQL bazi podataka

Ako se okupljate za pohranu datoteka za preuzimanje u bazu podataka, morate pamtiti sljedeće tačke:

  • Morate koristiti Blob polje
  • Prije polaganja u bazu podataka, ne zaboravite da se prijavite na mysql_escape_string () string
  • Prilikom prikazivanja datoteke morate navesti zaglavlje sadržaja / tipa

Imajte na umu da skripta prikazuje vaš HTML ni na koji način nije spojen na skriptu koju slika mora izlaz. To moraju biti dvije različite aplikacije.

Skladištenje slika u bazi podataka nije dobar stil. Mnogo je pogodnije za pohranjivanje u bazi podataka samo na slike.

Dobivanje svojstava slika.

Ako imate zadatak da biste provjerili vrstu ili veličinu slike prije preuzimanja datoteke na poslužitelj, trebat će vam funkcija GetIMiMagesize (). Kao argument prihvata ime datoteke na disku i vraća niz, prva dva elementa su širine i visine, odnosno treći je tip slike. Ako je nemoguće pročitati ispravnu sliku iz navedene datoteke, funkcija vraća laž.

Učitavanje datoteka koje imaju rusko-jezičko ime

Prilikom preuzimanja na datoteku poslužitelja morate provjeriti njihova originalna imena za prisustvo "nestandardnih" znakova (na primjer, ruska slova). U slučaju njihovog prisustva potrebno je zamijeniti. Originalno ime datoteke možete pronaći u $ _Files ["Userfile"] ["Name"] varijabla. Kako napuniti nizu ruskog jezika za prevod možete se naći u primjerima PHP-a.

Preuzmi prikaz statusa (traka napretka)

Mora se imati na umu da dok datoteka ne bude u potpunosti preuzeta, PHP ne može raditi ili veličinu datoteke ili postotka njegovog učitavanja. Tek kada je datoteka već na PHP poslužitelju, moći će pristupiti informacijama. Ako i dalje trebate implementirati takvu priliku, koristite Java-Applet.

Prava na datoteke

Problemi s pravima na poslužitelju (upload_tmp_dir)

U operativnim sistemima sličnim UNIX-om, svaka mapa, datoteka, veza postavlja se usklađenost sa dozvolama. Oni mogu izgledati kao rwx-rw-r- ili kao broj 754.

Dostupnost datoteke ili direktorija ovisi o korisničkom ID-u i grupnom identifikatoru u kojem ulazi. Način u cjelini opisano je u pogledu tri sekvence, tri slova svaka:

Vlasnik Ostala grupa (U) (G) (O) RWX RWX RWX

Ovdje su vlasnik, članovi grupe i svi ostali korisnici imaju prava na čitanje datoteke, pišu na njega i njegovo pogubljenje. Prava - bilo kakva smislena kombinacija sljedećih slova:

r desno za čitanje. (četiri)
W Pravo na snimanje. (2)
x pravo na izvršenje (pretraga u katalogu). (jedan)

  • Instalirajte vlasnika korisničkog imenika, a čije atrakcije izvode Apache. To se može naći iz datoteke httpd.conf ili pregledavanje popisa procesa na poslužitelju. Prava direktorija trebala bi biti 700 (RWX ------).
  • Bez obzira na to ko je vlasnik kataloga, uspostavi prava 777 (rwxrwxrwx).

    Primjer implementacije preuzimanja slika na server.

    $ max_image_width \u003d 380; $ max_image_heeght \u003d 600; $ max_image_size \u003d 64 * 1024; $ valja_types \u003d Array ("GIF", "JPG", "PNG", "JPEG"); IF (Isset ($ _ datoteke ["userfile"])) (ako (Is_uploaded_file ($ _ datoteke ["userfile"] ["tmp_name"]))) ($ filename \u003d $ _Files ["userfile"] ["tmp_name"] ["tmp_name"] ; $ _ Datoteke ["Userfile"] ["Naziv"], 1 + strpos ($ _ datoteke ["userfile"] ["naziv"]; ako (datoteka (datoteka datoteke) )\u003e $ max_image_size) (Echo "Greška: Veličina datoteke\u003e 64k.";) Elseif (! in_array ($ ext, $ valid_type)) (Echo "Greška: Nevažeća vrsta datoteke ($ Veličina \u003d GetiMages ($ veličine \u003d genimize ($ Naziv datoteke); ako (($ veličine) && ($ veličine)< $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 "
    Pošaljite ovu datoteku:
    "; }
  • U našem članku smatramo primer stvaranja PHP datoteke Preuzmi skriptu na server. Naš jednostavan primer preuzimanja datoteka imat će 2 datoteke: obrazac (obrazac.HTML), PHP datoteke za preuzimanje skripte (uploader.php).

    Sada ćemo sve detaljno analizirati. Prvo, analizirajte datoteku obrasca forme.html:


    Kao što vidite ovaj jednostavan HTML kod, ovdje se ne može komplicirati, jedini ako će obrazac učitati datoteke na poslužitelj, a atribut mora biti registriran enctype \u003d "višertni /oblika-podaci ".

    Naš oblik će izgledati ovako:

    PrimerPHP datoteka za preuzimanje datoteke

    Sada ćemo to shvatiti sa PHP datotekom koja će preuzeti datoteke na server. Ispod je njegov izvorni kod:

    // gdje će se datoteka postaviti $ Clear_PATH \u003d '; / * Dodajte originalnu naziv datoteke na naš ciljni put. Rezultat je "Uploaded_files / filename.extension" * / $ clear_path \u003d $ Clear_path. Basename ($ _ Datoteke ["file"]); ako (potez_uploaded_file ($ _ datoteke ["datoteke"] ["tmp_name"], $ Clear_path)) (echo "datoteka". Datoteka ($ _ datoteke [" "] [" Ime "])." Je preneseno ";) drugo (Echo" Došlo je do greške prijenosa datoteke, pokušajte ponovo! ";)

    Kako PHP datoteka za preuzimanje datoteke?

    uploader.php je jednostavna PHP datoteka za preuzimanje scenarija na poslužitelju koji će preuzeti naše datoteke u određeni direktorij web lokacije koji je naveden u $ Clear_Path \u003d "Uploader_Files /";

    Pa, sama po sebi, izrađujemo elementarni izlaz poruka koristeći ako / inače, bilo je jasno, naša datoteka je učitana ili ne.

    HACHER HACKING ZAŠTITA Kada preuzimate datoteku

    Razmotrit ćemo ne samo zaštitu u pogledu hakerskih hakiranja, već i drugih neželjenih problema koji nastaju prilikom preuzimanja datoteka na server.

    PHP datoteke

    Ovo je prvi problem povezan sa preuzimanjem datoteka na server. Kada datoteka za preuzimanje ima PHP školjku, a to ne znači da će njeno proširenje biti PHP. Može imati sliku pogleda.jpg (.gif, .png ...). Ali iznutra izgleda ovako:

    Neki zanatlije mogu izvesti naredbe na poslužitelju pomoću surfanja URL-a:

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

    Način zaštite:

    Da biste zaštitili, možete implementirati MIME provjeru datoteka. Ispod pogledajte primjer:

    Ako ($ _ datoteke ["datoteka"] ["Tip"]! \u003d "Slika / gif") (Echo "Žao nam je, samo sve prenoseći GIF slike"; izlaz;)

    Ovaj komad PHP koda provjerava da li je datoteka za preuzimanje GIF datoteka. Umetnite ovaj kod prije php datoteke za preuzimanje skripte. Prirodno možete promijeniti ček na JPG-u, Pngi ostale datoteke koje su vam potrebne.

    To je istina za reći, a ova metoda zaštite može se zaobići ako pošaljete zaglavlje zaglavlja, sa MIME uputama. Da biste to učinili, potrebno je provjeriti raspoloživost Oznake u datoteci za preuzimanje.

    Ograničavanje veličine preuzete datoteke

    Također mogu postojati i problemi sa velikim veličinama datoteka koje će zauzimati prostor na disku. Da biste to učinili, napišite granicu veličine datoteke koja se preuzima.

    To možete učiniti pomoću obrasca, za to morate dodati sljedeću liniju u kontekst HTML obrasca:

    Ovo skriveno polje za unos ograničit će veličinu datoteke za preuzimanje. Ili možete provjeriti veličinu datoteke PHP alata.

    Napisati O.pHP datoteka za preuzimanje može biti dugačak, ali već smo rastavljali osnovni princip preuzimanja datoteka na server. Stoga, ako neko ima više pitanja, pitajte ih u komentarima.

    Danas se usluga preuzimanja datoteka na poslužitelju (hosting) nalazi na svim web lokacijama za društvene mreže, biltenskim pločama, web lokacijama za upoznavanje itd. Suština je omogućiti posjetitelju web resursu da objavi svoje datoteke (fotografije, dokumente) na internetu.

    Prilikom pružanja ove usluge postoji jedan značajan minus. Činjenica je da dopuštajući da preuzmete datoteku na vaš server, mi, kao što jeste, instalirajte vrata iza kojih je potrebna stalna kontrola. Budući da u dosjeu posjetitelja mogu biti samo korisne informacije, već i virusni kod koji mogu kasnije omogućiti napadačima da preuzmu vaš server. S obzirom na ovaj minus, morate pažljivo provjeriti datoteke prije preuzimanja na server.

    Ali neću vas zastrašiti, ali radije bih zamislio vašu pažnju već gotovu funkciju (PHP skripta) da provjeri i preuzme datoteke na poslužitelj. Funkcija je 100% rad. I ja ga koristim na svojim web lokacijama. Ova je funkcija napisana za preuzimanje slika slika (fotografije) u formatu.jpg, .gif, .png. Ali ako želite, možete izvršiti promjene kako biste prilagodili PHP skriptu prema vašim potrebama.

    U PHP skriptu se implementiraju dvije provjere:

    1. budući da poklopac ograničava veličinu datoteke koja se preuzima (u vrijeme pisanja ovog materijala imam ograničenje od 8 MB na svom hostingu), a zatim provjeravanje maksimalne veličine je neophodno;
    2. provjera proširenja datoteke omogućava vam prekidanje nepotrebnih datoteka prije preuzimanja.

    Nadam se da je kôd funkcije dovoljno objasnjen za rješavanje datoteke za preuzimanje na poslužitelju. Ali ako imate bilo kakvih pitanja, rado ću odgovoriti u komentarima.

    Sad o tome kako ga praktično implementirati

    Php kôd postavljamo u zasebnu datoteku: Funkcija.php i stavite ga na server u korijenskom direktoriju.

    I stvorite HTML datoteku u kojoj ćete objaviti obrazac za preuzimanje fotografije: index.html

    upload.php - rukovatelj datoteke datoteke
    Ime \u003d "Dugme" - naziv gumba, kada kliknete na koji se pokreće funkcija preuzimanja datoteke na poslužitelju

    Učitavanje više datoteka

    Sada ćemo analizirati slučaj kada trebate preuzeti više datoteka na server.
    Da biste to učinili, potrebna nam je u funkciji.php datoteke update.php i index.html napraviti neke promjene.





    Možda, ovo je sve što trebate da implementirate uslugu za preuzimanje korisničke datoteke na server (hosting).

    Druga značajka koja je usko povezana sa preuzimanjem grafičkih datoteka (fotografije) je funkcija za promjenu veličine slika:

    Višestruki oblici

    • Web ierfases poštanskih usluga koji omogućuju dodavanje aplikacije na slovo (priložite), a za to prvo trebate preuzeti datoteku na poslužitelj, a tek nakon toga može se dodati u slovo;
    • Interaktivne fotogalerije i foto albumi koji ne mogu postojati bez mehanizma za preuzimanje datoteke na poslužitelj;
    • Besplatni softverski portali koji se koriste za razmjenu datoteka različitih programa itd.

    Preuzimanje datoteke na poslužitelj vrši se pomoću višestruke forme, u kojem postoji polje za učitavanje datoteka. Parametar Encotype označava višestruke / obrasce:



    Ovo će izgledati kao data višestruka višestruka obrazac (možete pokušati da biste vidjeli rezultat višestrukih obrazaca, preuzimajući malo male datoteke na server):

    Višestruki oblici obično koriste metodu prenosa post. Kao što se može vidjeti iz prethodnog primjera, ovaj obrazac ima dva polja:

    • Polje za odabir datoteke za preuzimanje ;
    • Polje određivanja naziva datoteke koje će morati imati na poslužitelju .

    Obrada višestruke obrasce

    Prije nego što nastavite sa pisanjem scenarija za obradu više obračuna, morate uređivati \u200b\u200bkonfiguracijsku datoteku php.ini. Da biste omogućili preuzimanje datoteka na server.

    PHP PHP.ini konfiguracijska datoteka ima tri parametra povezana sa preuzimanjem datoteka na server:

    • file_uploads \u003d On - omogućava vam preuzimanje datoteka na poslužitelj putem HTTP protokola;
    • upload_tmp_dir \u003d / tmp - postavlja direktorij za privremeno pohranu preuzetih datoteka;
    • upload_max_filesize \u003d 2m - postavlja maksimalnu količinu preuzete datoteke.

    Ako vaš web poslužitelj pokreće pokretanje Linux operativnog sistema, a zatim trebate ponovo pokrenuti uslugu:

    servis httpd Restart.

    Kako PHP rješava višestruke oblike? Nakon primitka datoteke, štedi je u privremenom direktoriju upload_tmp_dir, naziv datoteke se odabran nasumično. Tada stvara četiri varijable superglobalnog maraka $ _files. Ovaj niz sadrži podatke o preuzetu datoteku.

    Varijable definirane za preuzete datoteke ovise o PHP verziji i trenutnoj konfiguraciji. Superglobal $ _Files Array dostupan je iz PHP 4.1.0. U slučaju da se konfiguracijska direktiva registrira_globals postavlja vrijednost na.dodatno će biti proglašene varijable s odgovarajućom imenima. Počevši od verzije 4.2.0, zadana vrijednost za opciju Register_Globals je isključeno.

    Sadržaj niza $ _Files za naš primjer dat je u nastavku. Imajte na umu da se pretpostavlja da koristi naziv učilaca za polje za odabir datoteke, u skladu s gore navedenim višestrukim obrascem. Naravno, ime polja može biti bilo koji.

    • $ _Files ["uploadfile"] ["naziv"] - Naziv datoteke prije slanja na poslužitelj, na primjer, pict.gif;
    • $ _Files ["uploadfile"] ["Veličina"] - Veličina primljene datoteke u bajtovima;
    • $ _Files ["uploadfile"] [tip "tip"] - MIME tip primljene datoteke (ako je pretraživač mogao odrediti), na primjer: slika / gif, slika / png, slika / jpeg, tekst / html;
    • (Dakle, nazvali smo polje preuzimanja datoteka) - sadrži naziv datoteke u privremenom direktoriju, na primjer: / tmp / phpv3b3qy;
    • $ _Files ["uploadfile"] ["Greška"] -Kôd pogreške koji se može pojaviti kada se datoteka učita. Ključ ["greška"] Dodana je u PHP 4.2.0. Uz odgovarajuće kodove grešaka, možete se upoznati sa sobom

    Nakon dovršetka skripte, privremena datoteka će se izbrisati. To znači da ga moramo kopirati na drugo mjesto dok se skripta ne završi. To je, algoritam za radno scenarij datoteke za preuzimanje na poslužitelju je:

    Ako se pritisne tipka "Pošalji", datoteka će se već preuzeti na server i njegovo ime će biti u $ _Files ["uploadfile"] ["name"] varijablu. U ovom slučaju, skripta mora odmah kopirati datoteku nazvana $ _Files ["uploadfile"] ["tmp_name"] Na neki katalog (morate pisati u ovaj direktorij).

    Kopiranje datoteka izvodi se funkcijama kopiraj () :

    Koristite samo funkciju kopiranja () kopiranja (), a ne krećete, jer:

    • Privremena datoteka će se automatski ukloniti;
    • Ako je privremeni direktorij na drugom mediju, prikazat će se poruka o pogrešci.

    Pretpostavimo da datoteku trebamo preuzeti u direktorij uploads, koji se nalazi u korijenskom direktoriju web servera (u imeniku dokumenta).

    // samo u slučaju, stvorite direktorij. Ako je već stvoren,
    // Poruka o grešci koju nećemo vidjeti, jer ćemo koristiti @ operator:

    @mkdir ("upload", 0777);

    // Kopirajte datoteku iz / tmp u prijenos
    // Naziv datoteke bit će isti kao prije slanja na server:

    Kopirajte ($ _ datoteke ["uploadfile"] ["TMP_NAME"], "Uploads /". Basename ($ _ datoteke ["uploadfile"] ["Naziv"])

    U Linuxu je sve mnogo složenije - moramo uzeti u obzir prava pristupa u katalogu prijenosa. Najvjerovatnije, u ovom slučaju funkciju mkdir () Neće raditi, jer nemamo pravo napisati direktorij dokumente (obično / var / www / html ili / home / httpd / html). Registrirajte se kao korijenski sustav, kreirajte direktorij prenosa i promijenite svoj vlasnik i prava pristupa na sljedeći način:

    // Kreirajte katalog uploads

    // Instalirajte naziv vlasnika Apache i njegove grupe - također Apache:

    CHOW Apache: Apache prijenosi

    // pisati rezoluciju svima (777) + ugradnju bita za pričvršćivanje (1):

    Chmod 1777 uploads.

    Veličina datoteke može biti ograničena, ako želite, možete uređivati \u200b\u200b.htaccess datoteku i ograničiti pristup direktoriju za prijenos - navedite ili određene korisnike koji mogu pristupiti direktoriju ili IP adrese.

    Sada možete prenijeti datoteke na server.

    PHP skriptu pišemo datoteke za preuzimanje na server


    // katalog u kojem ćemo dobiti datoteku:
    $ uploaddir \u003d "./files/";
    $ Uploadfile \u003d $ uploadajdir. Basename ($ _Files ["uploadfile"] ["Naziv"]);

    // Kopirajte datoteku iz direktorija za privremenu pohranu datoteka:
    ako (kopija ($ _Files ["uploadfile"] ["tmp_name"], $ uploadfile))
    {
    eho. "

    Datoteka se uspješno preuzme na server.

    " ;
    }
    drugo (odjek) "

    Greška! Nije uspjelo preuzeti datoteku na server!

    "
    ; Izlaz; )

    // Prikažite informacije o preuzetu datoteku:
    eho. "

    Informacije o datoteci učitanoj na poslužitelju:

    "
    ;
    eho. "

    Originalno ime preuzete datoteke: ". $ _Files ["uploadfile"] ["ime"]. "

    " ;
    eho. "

    MIME tip preuzete datoteke: ". $ _Files ["uploadfile"] ["Tip"]. "

    " ;
    eho. "

    Veličina učitane datoteke u bajtovima: ". $ _Files ["veličina"] ["Veličina"]. "

    " ;
    eho. "

    Privremeno ime datoteke: ". $ _Files ["uploadfile"] ["tmp_name"]. "

    " ;

    ?>

    Učitavanje više datoteka može se implementirati pomoću, na primjer, različite vrijednosti naziva za ulaznu oznaku.

    Također predviđa mogućnost automatskog pribavljanja informacija organiziranih u nizu nekoliko istovremeno preuzimanje datoteka. Da biste implementirali takvu priliku, koristite iste sintakse podataka polja iz HTML obrasca kao za više polja za odabir i potvrdni okvir:


    Pošaljite ove datoteke:






    U slučaju da je takav obrazac poslao, pošiljke ["userfile"], $ _Files ["userfile"] ["naziv"] i $ _Files ["userfile"] ["veličine"] biće inicijalizirana (u isti način kao i $ http_post_files za PHP 4.1.0 i starije verzije). Ako je Direktiva o konfiguraciji registra_globals postavljena na osnovu vrijednosti, pridružene globalne varijable također će se inicijalizirati. Svaka od ovih varijabli bit će numerički indeksirani niz odgovarajućih vrijednosti za primljene datoteke.

    Pretpostavimo da su /home/test/some.html i /home/test/file.bin datoteke preuzete. U ovom slučaju, $ _Files ["Userfile"] ["Name"] varijabla će imati nešto.html vrijednost, a $ _Files ["userfile"] varijabla ["naziv"] je datoteka.bin. Slično tome, varijabilni $ _Files ["Userfile"] ["Veličina"] sadrži veličinu datoteke Neki.HTML i tako dalje.

    Varijable $ _Files ["userfile"] ["ime"], $ _Files ["userfile"] ["tmp_name"], $ _Files ["Userfile"] ["Veličina"] i $ _Files ["Userfile"] ["Tip"] će se inicijalizirati i.

    Zaključak:

    Kao što vidite, nije tako teško organizirati preuzimanje datoteka na server. Teže je osigurati potrebnu razinu sigurnosti, jer napadači mogu koristiti datoteke za učitavanje na poslužitelju na poslužitelju. Kako pružiti potrebnu razinu sigurnosti, radeći sa prijenosom, pogledajte.



    <<< Назад Sadržaj Naprijed \u003e\u003e\u003e
    Još uvijek postoje pitanja ili nešto nerazumljivo - dobrodošli u naše