Încărcarea fișierelor pe server folosind PHP. Un exemplu de încărcare a fișierelor pe server (încărcare) în php Cum se încarcă un fișier php

Sigur, tu des a încărcat diferite fișiere pe site-uri... De exemplu, încărcat avatare pe forum, fotografii pe rețelele sociale, diverse videoclipuri despre găzduirea video, doar fișiere pe găzduirea fișierelor. Și în acest articol veți afla cum să încărcați fișiere pe server în PHP... Este prin PHPîn majoritatea cazurilor, asta fac.

Primul lucru care trebuie învățat este că ea însăși Formular HTML, în care fișierul este substituit nu ar trebui să fie destul de obișnuit, iată un exemplu Cod HTML acest formular:





Punctul cheie aici este „ enctype„cu sens” multipart / formular-date„Nimic nu va funcționa fără ea.

", în care nu vom încărca încă fișierul, dar vom parcurge puțin diferitele Puncte importante care trebuie luat în considerare, în caz contrar siguranța poate suferi:

print_r ($ _ FIȘIERE);
?>

Drept urmare, veți vedea conținutul matrice bidimensională globală $ _FILES:

  • Nume- numele fișierului încărcat.
  • tip - De tip MIME fișier descărcat. Acesta este poate cel mai important parametru de securitate. Și întotdeauna când primiți fișiere, trebuie să verificați De tip MIME, altfel problemele nu se vor întoarce. În articolul următor vom vorbi despre acest lucru mai detaliat.
  • tmp_name- calea fizică către fișierul temporar. În acest loc este plasat fișierul și abia apoi îl transferăm într-o altă locație. De fapt, fișierul a fost deja încărcat și trebuie doar să-l mutăm în dosarul dorit pe server.
  • eroare- cod de eroare. Dacă 0 , atunci nu există erori.
  • mărimea- dimensiunea fișierului încărcat. Aceasta este, de asemenea, o opțiune frecvent utilizată și ar trebui să fie verificată și la limitați dimensiunea fișierelor încărcate... Desigur, această dimensiune este limitată de serverul însuși, cu toate acestea, pentru orice imagine, această dimensiune este clar supraevaluată (de regulă, 10 MB).

Și toți acești parametri sunt prezenți pentru fiecare fișier încărcat (fiecare dintre acestea fiind un tablou în matrice bidimensională $ _FISIERE).

Acum să terminăm cu încărcarea fișierelor pe server în PHP, și pentru aceasta scriem următorul cod (""):

$ uploadfile = "images /".$_ FILES [" somename "] [" name "];
move_uploaded_file ($ _ FILES ["somename"] ["tmp_name"], $ uploadfile);
?>

Adică, mai întâi setăm calea către fișierul încărcat pe server. Aici vrem să punem fișierul în directorul " imagini"cu același nume ca și fișierul pe care îl avea înainte. Și funcția move_uploaded_file () mutăm fișierul în directorul ales de noi din stocarea temporară.

Cu toate acestea, vă rugăm să rețineți că acest lucru este foarte important! În niciun caz nu trebuie să utilizați codul, altfel site-ul dvs. va exista un pericol grav! De fapt, pe acest moment absolut orice poate fi descărcat: orice fișiere executabile, scripturi, Pagini HTMLși alte lucruri foarte periculoase. Prin urmare, asigurați-vă că verificați cu atenție fișierele încărcate pe server. Și asta vom face în articolul următor. Deoarece subiectul este foarte important, vă sfătuiesc să vă abonați la actualizări pentru a nu rata acest articol.

JavaScript este blocat în browserul dvs. Vă rugăm să activați JavaScript pentru ca site-ul să funcționeze!

Încărcarea fișierelor pe server

Scurtă excursie la încărcare

Ce este Încărcare fișiere sau de ce nu funcționează
copy ("c: \ images \ sample.jpg", "http://mysite.ru/uploads/sample.jpg")

Chiar dacă aveți la dispoziție un singur computer, pe care sunt combinate atât un server cât și o stație de lucru, nu uitați că php folosește tehnologia client / server. Fișierul pe care dorim să îl descărcăm este de obicei localizat pe computerul clientului, adică un utilizator, un vizitator obișnuit al site-ului. Destinația este serverul. Pentru a finaliza procesul de transfer de fișiere, avem nevoie de următorul formular:

Trimiteți acest fișier:

În acest caz, câmpul de acțiune trebuie să conțină adresa URL a scriptului php, care va procesa în continuare fișierele încărcate. Câmpul ascuns MAX_FILE_SIZE trebuie să preceadă câmpul de selecție a fișierului și să conțină dimensiunea maximă permisă a fișierului în octeți. Scopul său este de a verifica dimensiunea fișierului chiar înainte ca fișierul să fie trimis la server. Acest lucru ar trebui să salveze utilizatorul de încărcarea îndelungată și ineficientă a unui fișier pe server și generarea de trafic inutil, dar nu vă bazați pe această limitare, deoarece este ușor să o ocoliți.

Ce se întâmplă atunci când un utilizator selectează un fișier de pe discul său și face clic pe butonul „Trimite fișier”? Browserul trimite fișierul către server, unde interpretul php îl plasează în directorul său temporar, atribuindu-i un nume aleatoriu și executând scriptul specificat în câmpul de acțiune.

Cum ar trebui să arate upload.php?

$ uploaddir = "/ var / www / uploads /"; if (move_uploaded_file ($ _ FILES ["userfile"] ["tmp_name"], $ uploaddir. $ _FILES ["userfile"] ["name"])) (print "Fișierul este valid și a fost încărcat cu succes.";) altfel (tipăriți „Există câteva erori!”;)

Când scrieți un script, apare o întrebare firească: cum să obțineți informații despre fișierul descărcat și să accesați fișierul în sine. Dacă utilizați Versiuni PHP 0 și mai vechi, cel mai bine este să consultați matricea globală $ _FILES. Pentru fiecare fișier încărcat, acesta conține o matrice hash cu următoarele date:

  • $ _FILES ["userfile"] ["name"]- numele original al fișierului, cum ar fi fost văzut de utilizator la selectarea fișierului;
  • $ _FILES ["userfile"] ["type"]- mimica / tipul fișierului, de exemplu, poate fi imagine / gif; acest câmp este util dacă doriți să furnizați o interfață pentru descărcarea fișierelor încărcate;
  • $ _FILES ["userfile"] ["size"]- dimensiunea fișierului încărcat;
  • $ _FILES ["userfile"] ["tmp_name"]- calea completă către fișierul temporar de pe disc;
  • $ _FILES ["userfile"] ["error"]- De la versiunea 4.2.0, conține un cod de eroare care este 0 dacă operațiunea a avut succes.

Pentru versiunile PHP sub 4.1.0, această matrice se numește $ HTTP_POST_FILES. Nu uitați că, spre deosebire de $ _FILES, această matrice nu este superglobală și când accesați-o, de exemplu, dintr-o funcție, trebuie să specificați în mod explicit $ HTTP_POST_FILES global;

Dacă în setările serverului dvs. register_globals = on, variabile suplimentare de forma $ userfile_name, $ userfile_type, $ userfile_size ... identificate. Cel mai bun mod pentru a obține informații despre fișierele încărcate - utilizați matricea $ _FILES.

Cel mai bun mod de a lucra cu fișierele încărcate este să folosiți funcțiile încorporate is_uploaded_file () și move_uploaded_file (), care verifică dacă un fișier a fost încărcat și îl plasează în folderul specificat, respectiv. Puteți găsi informații mai detaliate pe paginile manualului. Nu ar trebui să reinventați roata și să lucrați singur cu fișiere temporare, să le copiați, să le ștergeți. Acest lucru s-a făcut deja pentru tine și pentru tine.

Reglare server

Am făcut totul bine, dar ceva nu funcționează pentru mine. Poate că serverul meu este greșit configurat?

Dacă ai „făcut totul bine”, dar codul tău nu funcționează sau nu funcționează corect, nu te grăbi să disperi. Poate că problema nu este în mâinile tale, ci în setările greșite ale serverului. Iată o listă de directive care au legătură cu încărcările de fișiere:

În fișierul php.ini:

  • Dacă doriți să știți unde se află php.ini, rulați
  • file_uploads- capacitatea de a interzice sau permite descărcarea fișierelor în general. Valoarea implicită este Activată.
  • upload_max_filesize- dimensiunea maximă a fișierului care poate fi încărcată. Dacă trebuie să lucrați cu fișiere mari, modificați această setare. Valoarea implicită este 2M. Nu uitați să schimbați dimensiunea post_max.
  • post_max_size este o limită superioară generală a dimensiunii datelor transmise către Cerere POST... Dacă trebuie să lucrați cu fișiere mari sau să transferați mai multe fișiere în același timp, modificați această setare. Valoarea implicită este 8M.
  • upload_tmp_dir- un director temporar pe server unde vor fi plasate toate fișierele încărcate. Verificați ce drepturi i se stabilesc (dacă în această etapă aveți dificultăți, consultați explicațiile de la sfârșitul articolului). Un astfel de director trebuie să existe și utilizatorul sub care rulează Apache trebuie să aibă și permisiuni de scriere în acest director. Dacă lucrați cu restricția open_basedir activată, atunci directorul temporar trebuie să fie în interior. Nu trebuie să vă faceți griji cu privire la curățarea acestuia sau ca numele să fie unice, PHP vă rezolvă această problemă.

În dosar httpd.conf:

  • În primul rând, asigurați-vă că utilizați Server web Apache 1.3 (ultima versiuneîn momentul redactării acestui articol - 1.3.27). Dacă utilizați Apache 2.0, ar trebui să citiți următorul fragment din documentație:

    Nu utilizați Apache 2.0 și PHP într-un mediu de producție nici pe Unix, nici pe Windows.

  • Dacă primiți mesajul „Metoda POST nu este permisă”, înseamnă că trebuie să căutați ceva similar cu următoarele directive și să utilizați cuvânt cheie Permite: Comanda permite, refuză Permite de la toți
  • Probleme cu încărcarea fișierelor binare - o întrebare clasică „de ce se rup fisierele la încărcare”. Iată soluția propusă de Dima Borodin (http://php.spb.ru): În directorul în care se află scriptul, creați un fișier .htaccess, în care scriem: CharsetDisable On To file httpd.conf adăugați linii: CharsetRecodeMultipartForms Off

Mici explicații pentru această rețetă: problema de mai sus, atunci când arhivele încărcate pe server nu sunt despachetate și imaginile nu sunt afișate, poate apărea din cauza faptului că este utilizat serverul web rus Apache. Directiva CharsetDisable dezactivează modulul de procesare a setului de caractere, adică nu va avea loc o re-codificare la descărcarea fișierelor aflate în acest folder. Directiva CharsetRecodeMultipartForms dezactivează recodarea datelor trimise prin metoda POST cu antetul Content-Type: multipart / form-data. Acestea. datele binare transmise cu această setare vor fi lăsate în forma sa originală, iar tot restul conținutului site-ului va fi recodificat în conformitate cu setările curente ale serverului.

Dar acest lucru poate provoca complicații: fiți pregătiți pentru faptul că, în unele cazuri, va trebui să recodificați singuri părțile de text ale interogărilor. Iată ce spune documentația despre acest lucru:

Utilizați directiva CharsetRecodeMultipartForms, care a fost introdusă în PL23, dar trebuie totuși să recodați manual părțile de text ale solicitărilor. Pentru a face acest lucru, puteți utiliza API-ul rus Apache disponibil în alte module sau API-ul rus Apache Perl disponibil de la mod_perl.

Puteți găsi unul dintre exemplele de definire a codificării aici: http://tony2001.phpclub.net/detect_charset/detect.phps

Cea mai recentă documentație pentru Apache rusă se află pe site-ul său oficial: http://apache.lexa.ru/.

Nu uitați că, după orice modificare a configurației, trebuie să reporniți serverul web.

De asemenea, este posibil să configurați parametrii Apach folosind .htaccess:

Php_value upload_max_filesize 50M php_value post_max_size 50M

Caracteristici suplimentare

Încărcarea mai multor fișiere în același timp

Un exemplu de formular pentru încărcarea mai multor fișiere:

Trimiteți aceste fișiere:


Și nu uitați să creșteți post_max_size dacă se presupune că sunt multe fișiere

Încărcarea automată a fișierelor pe server

Nu uitați că fișierele de pe discul utilizatorului sunt informații confidențiale, cu care nici JavaScript, nici PHP nu au cea mai mică relație. Până când utilizatorul însuși a selectat fișierul folosind nu se poate vorbi de vreo lucrare cu el. Și nu uitați că u din acest domeniu Atributul value este protejat la scriere.

Stocarea fișierelor în baza de date mySQL

Dacă aveți de gând să stocați fișiere descărcabile într-o bază de date, trebuie să vă amintiți următoarele puncte:

  • Trebuie să utilizați un câmp BLOB
  • Înainte de a-l pune în bază, nu uitați să aplicați mysql_escape_string () pe linie
  • Când afișați un fișier, trebuie să specificați conținutul / tipul antetului

Amintiți-vă că scriptul care redă codul HTML nu are nicio legătură cu scriptul care ar trebui să redea imaginea. Acestea ar trebui să fie două aplicații diferite.

Stocarea imaginilor într-o bază de date nu este un stil bun. Este mult mai convenabil să stocați numai căile către fișierele de imagine din baza de date.

Obținerea proprietăților imaginii.

Dacă aveți o problemă pentru a verifica tipul sau dimensiunea unei imagini înainte de a încărca un fișier pe server, veți avea nevoie de funcția getimagesize (). Acesta ia numele unui fișier de pe disc ca argument și returnează o matrice, primele două elemente ale acestora fiind lățimea și respectiv înălțimea, iar al treilea este tipul de imagine. Dacă este imposibil de citit din fișierul specificat imagine corectă, funcția returnează fals.

Încărcarea fișierelor cu un nume în limba rusă

Când încărcați fișiere pe server, este necesar să verificați numele lor originale pentru prezența caracterelor „non-standard” (de exemplu, litere rusești). Dacă sunt prezente, acestea trebuie înlocuite. Numele fișierului original poate fi găsit în variabila $ _FILES ["userfile"] ["name"]. Modul de recodificare a unui șir de limbă rusă în transliterare poate fi găsit în exemplele PHP.

Afișarea stării de încărcare (bara de progres)

Trebuie avut în vedere faptul că, înainte ca fișierul să fie încărcat complet, PHP nu poate funcționa nici pe dimensiunea fișierului, nici pe procentul descărcării acestuia. Numai atunci când fișierul este deja pe serverul PHP poate accesa informațiile. Dacă încă mai aveți nevoie disperată de acest lucru, utilizați applet-ul Java.

Permisiuni de fișiere

Probleme cu drepturile serverului (upload_tmp_dir)

Pe Unix-like sisteme de operare fiecare folder, fișier, link are o corespondență a drepturilor de acces. Pot arăta ca rwx-rw-r- sau numărul 754.

Disponibilitatea unui fișier sau director depinde de ID-ul utilizatorului și de ID-ul grupului utilizatorului. Modul este în general descris în termeni de trei secvențe, fiecare cu trei litere:

Grup de proprietari Altele (u) (g) (o) rwx rwx rwx

Aici, proprietarul, membrii grupului și toți ceilalți utilizatori au citit, scriu și execută permisiuni pentru fișier. Drepturi - orice combinație semnificativă a următoarelor litere:

r Dreptul de a citi. (4)
w Dreptul de a scrie. (2)
x Executați la dreapta (căutare director). (unu)

  • Setați proprietarul directorului la utilizatorul sub ale cărui privilegii este executat apache. Acest lucru poate fi găsit în fișierul httpd.conf sau examinând lista proceselor de pe server. Drepturile de director trebuie să fie de 700 (rwx ------).
  • Indiferent de cine deține directorul, setați drepturile la 777 (rwxrwxrwx).

    Un exemplu de implementare a încărcării imaginilor pe server.

    $ max_image_width = 380; $ max_image_height = 600; $ max_image_size = 64 * 1024; $ valid_types = array ("gif", "jpg", "png", "jpeg"); if (isset ($ _ FILES ["userfile"])) (if (is_uploaded_file ($ _ FILES ["userfile"] ["tmp_name"])) ($ filename = $ _FILES ["userfile"] ["tmp_name"] ; $ ext = substr ($ _ FILES ["userfile"] ["name"], 1 + strrpos ($ _ FILES ["userfile"] ["name"], ".")); if (file size ($ filename )> $ max_image_size) (echo "Eroare: dimensiune fișier> 64K.";) elseif (! in_array ($ ext, $ valid_types)) (echo "Eroare: tip de fișier nevalid.";) else ($ size = GetImageSize ($ numele fișierului); if (($ size) && ($ size< $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Trimiteți acest fișier:
    "; }
  • În articolul nostru vom analiza un exemplu de creare a unui script php pentru încărcarea fișierelor pe server. Exemplul nostru simplu de încărcare a fișierelor va avea 2 fișiere: un formular (form.html), un script de încărcare a fișierelor php (uploader.php).

    Acum să aruncăm o privire la toate detaliile. Mai întâi, să analizăm fișierul formular form.html:


    După cum puteți vedea, este simplu cod html, nu este nimic complicat aici, singurul lucru este că, dacă formularul va încărca fișiere pe server, atunci atributul trebuie scris enctype = "multipart /formă-date ".

    Formularul nostru va arăta astfel:

    ExempluScript de încărcare a fișierului PHP

    Acum să ne ocupăm de fișier php care va încărca fișiere pe server. Codul său sursă este furnizat mai jos:

    // Unde va fi plasat fișierul $ target_path = 'uploaded_files / "; / * Adăugați numele de fișier original la calea noastră țintă. Rezultatul este" uploaded_files / filename.extension "* / $ target_path = $ target_path. Basename ($ _ FILES ["file"] ["name"]); if (move_uploaded_file ($ _ FILES ["file"] ["tmp_name"], $ target_path)) (ecou "The file". Nume de bază ($ _ FILES ["file) "] [" nume "])." a fost încărcat ";) altfel (ecou" A apărut o eroare la încărcarea fișierului, vă rugăm să încercați din nou! ";)

    Cum funcționează scriptul de încărcare a fișierelor PHP?

    uploader.php este php simplu un script pentru încărcarea fișierelor pe server, care va încărca fișierele noastre într-un director specific al site-ului, care este indicat de linia $ target_path = "uploaded_files /";

    Ei bine, desigur, facem o afișare elementară a mesajelor folosind if / else, astfel încât să fie clar dacă fișierul nostru este încărcat sau nu.

    Protecție împotriva spargerilor hackerilor la încărcarea unui fișier

    Vom lua în considerare nu numai protecția în ceea ce privește atacurile hackerilor, ci și alte probleme nedorite care apar la încărcarea fișierelor pe server.

    Fișier wrapper PHP

    Aceasta este prima problemă cu încărcarea fișierelor pe server. Când un fișier încărcat are un înveliș php, nu înseamnă că extensia acestuia va fi php. Poate fi sub forma image.jpg (.gif, .png ...). Dar în interior arată așa:

    Unii meșteri pot executa, de asemenea, comenzi pe server navigând pe adresa URL:

    $ curl http: //server/uploads/shell.php? command = any_unix_command

    Metoda de protecție:

    Pentru protecție, puteți implementa validarea fișierului MIME. Vedeți un exemplu mai jos:

    If ($ _ FILES ["file"] ["type"]! = "Image / gif") (ecou "Ne pare rău, permitem doar încărcarea imaginilor GIF"; exit;)

    Piesa asta cod PHP verifică dacă fișierul încărcat este un fișier GIF. Lipiți acest cod înainte de scriptul de încărcare a fișierului php. Bineînțeles, puteți schimba cecul în jpg, png sau alte fișiere de care aveți nevoie.

    Într-adevăr, această protecție poate fi ocolită prin trimiterea unui antet cu indicii MIME. Pentru a face acest lucru, trebuie să verificați disponibilitateaetichete în fișierul de descărcare.

    Limitarea dimensiunii fișierului încărcat

    De asemenea, pot apărea probleme cu marime mare fișiere care vă vor ocupa spațiul pe disc. Pentru a face acest lucru, trebuie să scrieți o limită pentru dimensiunea fișierului încărcat.

    Puteți face acest lucru folosind un formular, pentru aceasta trebuie să adăugați următoarea linie la contextul html al formularului:

    Acest câmp de introducere ascuns va limita dimensiunea fișierului încărcat. Sau puteți verifica dimensiunea fișierului utilizând PHP.

    Scrie desprescriptul de încărcare a fișierelor php poate dura mult, dar am acoperit deja principiul de bază al încărcării fișierelor pe server. Prin urmare, dacă cineva mai are întrebări, puneți-le în comentarii.

    Astăzi, serviciul pentru încărcarea unui fișier pe server (găzduire) se găsește pe toate site-urile retele sociale, panouri de mesaje, site-uri de întâlniri etc. Esența sa este de a permite vizitatorului unei resurse web să își publice fișierele (fotografii, documente) pe Internet.

    La furnizarea acest serviciu există un dezavantaj semnificativ. Faptul este că, permițând încărcarea unui fișier pe serverul nostru, așa cum ar fi, stabilim o ușă pentru care este necesar un control constant. Deoarece fișierul vizitatorului poate conține nu numai informații utile, dar și un cod viral care poate permite ulterior atacatorilor să preia serverul dvs. Având în vedere acest dezavantaj, este necesar să verificați cu atenție fișierele înainte de a încărca pe server.

    Dar nu te voi intimida, ci mai degrabă îți voi prezenta o funcție gata pregătită (script PHP) pentru verificarea și încărcarea fișierelor pe server. Funcția este 100% funcțională. Eu însumi îl folosesc pe site-urile mele. Această funcție scris pentru încărcarea fișierelor de imagine (fotografii) în formatele .jpg, .gif, .png. Dar dacă doriți, puteți face modificări pentru a vă adapta Script PHP pentru a se potrivi nevoilor tale.

    Scriptul php implementează două verificări:

    1. deoarece hosterul limitează dimensiunea fișierului încărcat (în momentul scrierii acestui articol, am o limită de 8 Mb pentru găzduirea mea), atunci este necesară verificarea dimensiunii maxime;
    2. verificarea extensiei de fișier vă permite să filtrați fișierele inutile înainte de descărcare.

    Sperăm că codul funcției conține suficiente explicații pentru a face față încărcării fișierului pe server. Dar dacă aveți întrebări, vă voi răspunde cu plăcere în comentarii.

    Acum cum să-l implementăm în practică

    Punem codul PHP al funcției într-un fișier separat: function.php și îl plasăm pe server în directorul rădăcină.

    Și creați un fișier html în care vom plasa un formular pentru încărcarea unei fotografii: index.html

    upload.php - gestionar formular formular
    nume = "buton" - numele butonului, când faceți clic, începe funcția de încărcare a fișierului pe server

    Încărcarea mai multor fișiere

    Acum să analizăm cazul când trebuie să încărcați mai multe fișiere pe server simultan.
    Pentru aceasta, trebuie să facem unele modificări în fișierele function.php upload.php și index.html.





    Poate că acesta este tot ce aveți nevoie pentru a implementa un serviciu pentru încărcarea unui fișier personalizat pe server (găzduire).

    O altă funcție strâns legată de încărcarea fișierelor grafice (fotografii) este funcția de redimensionare a fotografiilor:

    Forme multiple

    • Interfețe web de servicii de poștă care vă permit să adăugați un atașament la o scrisoare și pentru aceasta trebuie mai întâi să încărcați fișierul pe server și numai după aceea îl puteți adăuga la scrisoare;
    • Galerii foto interactive și albume foto care nu pot exista fără un mecanism de încărcare a fișierelor pe server;
    • Portaluri software gratuite care folosesc diverse programe pentru schimbul de fișiere etc.

    Încărcarea unui fișier pe server se realizează utilizând formularul multipart, care are un câmp de încărcare a fișierului. Parametrul enctype este multipart / formular-date:



    Așa va arăta formularul multipart dat (puteți încerca cu ajutorul acestuia să vedeți rezultatul multipart-formularului încărcând un fișier mic pe server):

    Formularele cu mai multe părți folosesc de obicei metoda de trimitere POST. După cum puteți vedea din exemplul anterior, acest formular are două câmpuri:

    • Câmp de selecție a fișierelor pentru încărcare ;
    • Câmpul pentru specificarea numelui fișierului, pe care ar trebui să îl aibă pe server .

    Prelucrarea formularelor multipart

    Înainte de a începe să scrieți un script pentru procesarea unui formular multipart, trebuie să editați fișierul de configurare php.ini pentru a permite încărcarea fișierelor pe server.

    Fișierul de configurare PHP php.ini are trei parametri legați de încărcarea fișierelor pe server:

    • file_uploads = Activat - permite încărcarea fișierelor pe server prin protocolul HTTP;
    • upload_tmp_dir = / tmp - setează un director pentru stocarea temporară a fișierelor încărcate;
    • upload_max_filesize = 2M - setează dimensiunea maximă a fișierelor încărcate.

    Dacă serverul dvs. web rulează Linux, trebuie să reporniți serviciul:

    repornirea serviciului httpd

    Cum gestionează PHP formularele multipart? După primirea fișierului, acesta îl salvează în directorul temporar upload_tmp_dir, numele fișierului este ales aleatoriu. Apoi creează patru variabile ale matricei superglobale $ _FILES. Această matrice conține informații despre fișierul încărcat.

    Variabilele definite pentru fișierele încărcate depind de versiunea PHP și de configurația curentă. Matricea superglobală $ _FILES este disponibilă de la PHP 4.1.0. În cazul în care directiva de configurare register_globals este setată la pe, în plus, vor fi declarate variabile cu nume corespunzătoare. De la versiunea 4.2.0, valoarea implicită pentru opțiunea register_globals este oprit.

    Conținutul matricei $ _FILES pentru exemplul nostru este prezentat mai jos. Rețineți că acest lucru presupune că numele uploadfile este utilizat pentru caseta de selectare a fișierului, așa cum se arată în formularul multipart de mai sus. Desigur, numele câmpului poate fi orice.

    • $ _FILES ["uploadfile"] ["name"] - numele fișierului înainte de a fi trimis la server, de exemplu, pict.gif;
    • $ _FILES ["uploadfile"] ["size"] - dimensiunea fișierului încărcat în octeți;
    • $ _FILES ["uploadfile"] ["type"] - tip MIME al fișierului încărcat (dacă browserul a reușit să îl determine), de exemplu: image / gif, image / png, image / jpeg, text / html;
    • (așa cum am numit câmpul de încărcare a fișierului) - conține numele fișierului în directorul temporar, de exemplu: / tmp / phpV3b3qY;
    • $ _FILES ["uploadfile"] ["error"] - Un cod de eroare care poate apărea la încărcarea unui fișier. Cheie ["eroare"] a fost adăugat în PHP 4.2.0. Vă puteți familiariza cu codurile de eroare corespunzătoare

    După terminarea scriptului, fișierul temporar va fi șters. Aceasta înseamnă că trebuie să îl copiem într-o altă locație înainte ca scriptul să se termine. Adică, algoritmul scriptului pentru încărcarea unui fișier pe server este după cum urmează:

    Dacă este apăsat butonul „Trimiteți”, fișierul va fi deja încărcat pe server și numele său va fi în variabila $ _FILES ["uploadfile"] ["nume"]. În acest caz, scriptul ar trebui să copieze imediat fișierul numit $ _FILES ["uploadfile"] ["tmp_name"]într-un anumit director (aveți nevoie de permisiuni de scriere în acest director).

    Fișierul este copiat de funcție copie () :

    Folosiți doar funcția copy (), nu mutați, deoarece:

    • Fișierul temporar va fi șters automat;
    • Dacă directorul temporar se află pe un alt suport, va fi afișat un mesaj de eroare.

    Să presupunem că trebuie să încărcăm un fișier în directorul de încărcare, care se află în directorul rădăcină al serverului web (sub directorul DocumentRoot).

    // Creați un director pentru orice eventualitate. Dacă a fost deja creat,
    // nu vom vedea mesajul de eroare deoarece vom folosi operatorul @:

    @mkdir ("uploads", 0777);

    // Copiați fișierul din / tmp în încărcări
    // Numele fișierului va fi același ca înainte de trimiterea la server:

    Copiați ($ _ FILES ["uploadfile"] ["tmp_name"], "uploads /". Basename ($ _ FILES ["uploadfile"] ["name"]));

    În Linux, lucrurile sunt mult mai complicate - trebuie să luăm în considerare permisiunile pentru directorul de încărcare. Cel mai probabil, în acest caz, funcția mkdir () nu va funcționa, deoarece nu avem permisiuni de scriere în directorul DocumentRoot (de obicei / var / www / html sau / home / httpd / html). Conectați-vă la sistem ca root, creați directorul de încărcare și modificați proprietarul și permisiunile după cum urmează:

    // Creați directorul de încărcări

    // Setați numele proprietarului apache și grupului său - și apache:

    Chown apache: încărcări de apache

    // Permiteți tuturor să scrie (777) + setați bitul de fixare (1):

    Încărcări Chmod 1777

    Dimensiunea fișierului poate fi limitată, dacă doriți, puteți edita fișierul .htaccess și restricționa accesul la directorul de încărcare - specificați fie utilizatori specifici care pot accesa directorul, fie adrese IP.

    Acum puteți încărca fișiere pe server.

    Scrierea unui script PHP pentru încărcarea fișierelor pe server


    // Directorul în care vom primi fișierul:
    $ uploaddir = "./files/";
    $ uploadfile = $ uploaddir. nume de bază ($ _FILES ["uploadfile"] ["nume"]);

    // Copiați fișierul din director pentru stocarea temporară a fișierelor:
    if (copiați ($ _FILES ["uploadfile"] ["tmp_name"], $ uploadfile))
    {
    ecou "

    Fișierul a fost încărcat cu succes pe server

    " ;
    }
    altfel (ecou "

    Greşeală! Nu s-a încărcat fișierul pe server!

    "
    ; Ieșire; )

    // Afișați informații despre fișierul încărcat:
    ecou "

    Informații despre fișierul încărcat pe server:

    "
    ;
    ecou "

    Numele original al fișierului încărcat: ". $ _FILES ["uploadfile"] ["nume"]. "

    " ;
    ecou "

    Tipul MIME al fișierului încărcat: ". $ _FILES ["uploadfile"] ["type"]. "

    " ;
    ecou "

    Dimensiunea fișierului încărcat în octeți: ". $ _FILES ["uploadfile"] ["size"]. "

    " ;
    ecou "

    Numele de fișier temporar: ". $ _FILES ["uploadfile"] ["tmp_name"]. "

    " ;

    ?>

    Încărcarea mai multor fișiere poate fi implementată folosind, de exemplu, valori de nume diferite pentru eticheta de intrare.

    De asemenea, oferă posibilitatea de a primi automat informații organizate într-o matrice despre mai multe fișiere descărcate simultan. Pentru a face acest lucru, utilizați aceeași sintaxă pentru trimiterea unui tablou dintr-un formular HTML ca pentru câmpurile de selectare și bifare multiple:


    Trimiteți aceste fișiere:






    În cazul în care un astfel de formular a fost trimis, matricile $ _FILES ["userfile"], $ _FILES ["userfile"] ["name"] și $ _FILES ["userfile"] ["size"] vor fi inițializate (exact la fel ca $ HTTP_POST_FILES pentru PHP 4.1.0 și versiuni anterioare). Dacă directiva de configurare register_globals este activată, vor fi inițializate și globals însoțitori. Fiecare dintre aceste variabile va fi o matrice indexată numeric a valorilor corespunzătoare pentru fișierele primite.

    Să presupunem că fișierele /home/test/some.html și /home/test/file.bin au fost descărcate. În acest caz, variabila $ _FILES ["userfile"] ["name"] va avea valoarea some.html, iar variabila $ _FILES ["userfile"] ["name"] va avea valoarea file.bin. La fel, variabila $ _FILES ["userfile"] ["size"] va conține dimensiunea fișierului some.html și așa mai departe.

    Variabile $ _FILES ["userfile"] ["name"], $ _FILES ["userfile"] ["tmp_name"], $ _FILES ["userfile"] ["size"] și $ _FILES ["userfile"] ["type"] vor fi, de asemenea, inițializate.

    Concluzie:

    După cum puteți vedea, nu este atât de dificil să organizați încărcarea fișierelor pe server. Este mai dificil să se asigure nivelul de securitate necesar, deoarece încărcarea fișierelor pe server poate fi folosită de intruși pentru a ataca serverul. Pentru informații despre cum să asigurați nivelul de securitate necesar în timp ce lucrați cu încărcări, consultați.



    <<< Назад Conţinut Înainte >>>
    Dacă mai aveți întrebări sau ceva nu este clar - bine ați venit la