Cum se încarcă un fișier în PHP (cu exemplu)

În acest articol, voi explica elementele de bază ale încărcării fișierelor în PHP. În primul rând, vom trece prin opțiunile de configurare PHP care trebuie să fie în loc pentru încărcări de fișiere de succes. În urma acestui lucru, vom dezvolta un exemplu real despre cum să încărcați un fișier. 

Configurați setările PHP

Există câteva setări de configurare PHP pe care doriți să le verificați în prealabil pentru încărcări de fișiere reușite. În această secțiune, vom trece prin fiecare opțiune care este importantă în ceea ce privește încărcarea fișierului PHP. Aceste opțiuni pot fi configurate în php.ini fişier.

Dacă nu sunteți sigur unde să vă găsiți php.ini fișier, aveți posibilitatea să utilizați php_ini_loaded_file () pentru ao localiza. Doar creați un fișier PHP pe serverul dvs. cu următoarea linie și deschideți-l din browser.  

Iată un extras dintr-un fișier de instalare cu câteva setări implicite.

; Fie pentru a permite încărcarea fișierelor HTTP. file_uploads = Pornit; Director temporar pentru fișierele încărcate HTTP. ; Va folosi sistemul implicit dacă nu este setat. ; upload_tmp_dir =; Dimensiunea maximă permisă pentru fișierele încărcate. upload_max_filesize = 16M; Numărul maxim de fișiere care pot fi încărcate printr-o singură solicitare max_file_uploads = 20; Dimensiunea maximă a datelor POST pe care PHP le va accepta. post_max_size = 20M max_input_time = 60 memorie_limit = 128M max_execution_time = 30

Setările cheie

file_uploads

Valoarea lui file_uploads ar trebui stabilită directiva Pe pentru a permite încărcarea fișierelor. Valoarea implicită a acestei directive este Pe.

upload_max_filesize

upload_max_filesize vă permite să configurați dimensiunea maximă a fișierului încărcat. În mod prestabilit, este setat la 2M (doi megaocteți) și puteți să înlocuiți această setare utilizând .htaccess fișierul de asemenea. Două megaocteți nu sunt foarte mult față de standardele de astăzi, deci este posibil să trebuiască să măriți acest lucru. Dacă primiți o eroare în acest sens fișierul depășește upload_max_filesize când încercați să încărcați un fișier, trebuie să măriți această valoare. Dacă faceți acest lucru, asigurați-vă că creșteți și el post_max_size (Vezi mai jos). 

upload_tmp_dir

Setează un director temporar care va fi utilizat pentru a stoca fișierele încărcate. În majoritatea cazurilor, nu trebuie să vă faceți griji în legătură cu această setare. Dacă nu îl setați, va fi utilizat directorul temp temp implicit.

post_max_size

post_max_size vă permite să configurați dimensiunea maximă a datelor POST. Deoarece fișierele sunt încărcate cu cereri POST, această valoare trebuie să fie mai mare decât cea pe care ați setat-o ​​pentru upload_max_filesize directivă. De exemplu, dacă dvs. upload_max_filesize este 16M (16 megabytes), poate doriți să setați post_max_size la 20M.

max_file_uploads

Acesta vă permite să setați numărul maxim de fișiere care pot fi încărcate simultan. Valoarea implicită este 20, o sumă rezonabilă.

max_input_time

Este numărul maxim de secunde în care un script are permisiunea de a analiza datele de intrare. Ar trebui să o setați la o valoare rezonabilă dacă aveți de-a face cu încărcări mari de fișiere. 60 (60 secunde) este o valoare bună pentru majoritatea aplicațiilor.

memory_limit

memory_limit directiva indică cantitatea maximă de memorie pe care o poate consuma un script. Dacă vă confruntați cu probleme în timpul încărcării fișierelor mari, trebuie să vă asigurați că valoarea acestei directive este mai mare decât cea pe care ați setat-o ​​pentru post_max_size directivă. Valoarea implicită este 128M (128 megaocteți), deci dacă nu aveți o dimensiune foarte mare post_max_size și upload_max_filesize, nu trebuie să vă faceți griji în legătură cu acest lucru.

max_execution_time

Este numărul maxim de secunde în care un script este permis să ruleze. Dacă vă confruntați cu probleme în timpul încărcării fișierelor mari, puteți lua în considerare creșterea acestei valori. 30 (30 secunde) ar trebui să funcționeze bine pentru majoritatea aplicațiilor.

Acum, să construim un exemplu din lumea reală pentru a demonstra încărcarea fișierelor în PHP.

Creați formularul HTML

Odată ce ați configurat setările PHP, sunteți gata să încercați capabilitățile de încărcare a fișierelor PHP.

Repetul nostru GitHub are un exemplu de cod pe care îl voi discuta pe parcursul acestui articol. Deci, dacă doriți să urmați, continuați și descărcați-l de la GitHub.

Vom crea două fișiere PHP: index.php și upload.php. index.php fișierul deține codul care este responsabil pentru afișarea formularului de încărcare a fișierului. Pe de altă parte, upload.php fișierul este responsabil pentru încărcarea unui fișier pe server.

De asemenea, un fișier va fi încărcat în uploaded_files director, astfel încât trebuie să vă asigurați că acest director există și este scris de către web-server utilizator.

În această secțiune, vom trece prin părțile cheie ale index.php fişier.

Să aruncăm o privire la index.php fișier pe GitHub:

    Incarcarea fisierului PHP   % s', $ _SESSION [' mesaj ']); unset ($ _ [ 'mesaj'] SESIUNE); ?> 
Incarca un fisier:

Deși poate arăta ca un formular tipic PHP, există o diferență importantă în valoarea lui enctype atributul

etichetă. Trebuie să fie stabilită multipart / form-data deoarece formularul conține câmpul de fișier.

enctype atributul specifică tipul de codificare care trebuie utilizat atunci când este trimis formularul și are una dintre următoarele trei valori:

  • application / x-www-form-urlencoded: Aceasta este valoarea implicită atunci când nu setați valoarea enctype atributul explicit. În acest caz, caracterele sunt codate înainte de a fi trimise la server. Dacă nu aveți câmpul de fișier în formularul dvs., ar trebui să utilizați această valoare pentru enctype atribut.
  • multipart / form-data: Când utilizați multipart / form-data valoare pentru enctypeatribut, vă permite să încărcați fișiere utilizând metoda POST. De asemenea, se asigură că caracterele nu sunt codate la trimiterea formularului.
  • text / plain: În general, acest lucru nu este utilizat. Cu această setare, datele sunt trimise necriptate.

Apoi, scoatem câmpul de fișiere, care vă permite să selectați un fișier de pe computer.

 

În afară de aceasta, am afișat un mesaj în partea de sus a formularului. Acest mesaj arată starea încărcării fișierului și va fi setată într-o variabilă de sesiune de către upload.php script-ul. Vom analiza mai mult acest lucru în secțiunea următoare.

% s', $ _SESSION [' mesaj ']); unset ($ _ [ 'mesaj'] SESIUNE); ?>

Deci, aceasta rezumă index.php fişier. În următoarea secțiune, vom vedea cum să gestionăm fișierul încărcat din partea serverului.

Creați logica de încărcare

În secțiunea anterioară, am creat formularul HTML care este afișat pe partea clientului și vă permite să încărcați un fișier de pe computer. În această secțiune, vom vedea omologul de pe server care vă permite să gestionați fișierul încărcat.

Trageți codul din upload.php fișier pe GitHub. Vom trece prin părțile importante ale dosarului.

În upload.php fișier, am verificat dacă este o solicitare POST validă în primul rând.

dacă isset ($ _ POST ['uploadBtn']) && $ _POST ['uploadBtn'] == 'Încărcare') ...

În PHP, atunci când un fișier este încărcat, $ _FILES superglobal variabila este populate cu toate informațiile despre fișierul încărcat. Este inițializată ca o matrice și poate conține următoarele informații pentru încărcarea reușită a fișierelor.

  • tmp_name: Calea temporară în care este încărcat fișierul este stocată în această variabilă.
  • Nume: Numele real al fișierului este stocat în această variabilă.
  • mărimea: Indică dimensiunea fișierului încărcat în octeți.
  • tip: Conține tipul mime al fișierului încărcat.
  • eroare: Dacă există o eroare la încărcarea fișierului, această variabilă este populate cu mesajul de eroare corespunzător. În cazul încărcării reușite a fișierelor, aceasta conține 0, pe care o puteți compara utilizând UPLOAD_ERR_OK constant.

După validarea solicitării POST, verificăm dacă încărcarea fișierului a avut succes.

dacă isset ($ _ FILES ['uploadedFile']) && $ _FILES ['uploadedFile'] ['error'] === UPLOAD_ERR_OK) ...

Puteți vedea că $ _FILES variabila este o matrice multidimensională, primul element este numele câmpului de fișier, iar cel de-al doilea element conține informații despre fișierul încărcat, așa cum am discutat mai sus.

Dacă încărcarea fișierului are succes, inițializăm câteva variabile cu informații despre fișierul încărcat.

// obține detalii despre fișierul încărcat $ fileTmpPath = $ _FILES ['uploadedFile'] ['tmp_name']; $ fileName = $ _FILES ['uploadedFile'] ['nume']; $ fileSize = $ _FILES ['uploadedFile'] ['dimensiune']; $ fileType = $ _FILES ['uploadedFile'] ['tip']; $ fileNameCmps = explode (".", $ fileName); $ fileExtension = strtolower (sfârșitul ($ fileNameCmps));

În fragmentul de mai sus, am descoperit extensia fișierului încărcat și l-am păstrat în $ fileextension variabil.

Deoarece fișierul încărcat poate conține spații și alte caractere speciale, este mai bine să dezinstalați numele fișierului și exact așa am făcut în fragmentul următor.

$ newFileName = md5 (timp (). $ fileName). '' . $ Fileextension;

Este important să restricționați tipul de fișier care poate fi încărcat în anumite extensii și să nu permiteți totul utilizând formularul de încărcare. Am făcut acest lucru verificând extensia fișierului încărcat cu un set de extensii pe care dorim să le permitem încărcarea.

$ permisfileExtensions = array ('jpg', 'gif', 'png', 'zip', 'txt', 'xls', 'doc'); dacă (in_array ($ fileExtension, $ allowedfileExtensions)) ...

În cele din urmă, folosim move_uploaded_file pentru a muta fișierul încărcat în locația specifică aleasă de noi.

// în care fișierul încărcat va fi mutat $ uploadFileDir = './uploaded_files/'; $ dest_path = $ uploadFileDir. $ NewFileName; dacă (move_uploaded_file ($ fileTmpPath, $ dest_path)) $ message = 'Fișierul a fost încărcat cu succes.';  altceva $ message = 'A apărut o eroare la mutarea fișierului pentru a încărca directorul. Asigurați-vă că directorul de încărcare este scris de serverul web. '; 

move_uploaded_file Funcția are două argumente. Primul argument este numele fișierului fișierului încărcat, iar al doilea argument este calea de destinație în care doriți să mutați fișierul.

În cele din urmă, redirecționăm utilizatorul la index.php fişier. De asemenea, am setat mesajul corespunzător în variabila sesiune, care va fi afișată utilizatorilor după redirecționarea în index.php fişier.

Cum funcționează toți ceilalți

Nu uitați să creați uploaded_files director și îl puteți face scris de către web-server utilizator. Apoi continuați și rulați index.php fișier, care ar trebui să afișeze formularul de încărcare a fișierului care arată astfel:

Faceți clic pe Naviga buton-care ar trebui să deschidă o casetă de dialog care vă permite să selectați un fișier de pe computer. Selectați un fișier cu una dintre extensiile permise în scriptul nostru și faceți clic pe Încărcați buton.

Aceasta ar trebui să trimită formularul și, dacă totul merge bine, ar trebui să vedeți fișierul încărcat în uploaded_files director. De asemenea, puteți încerca încărcarea altor fișiere cu extensii care nu sunt permise și verificați dacă scriptul nostru împiedică astfel de încărcări.

Concluzie

Astăzi, am discutat despre elementele de bază ale încărcării fișierelor în PHP. În prima jumătate a articolului, am discutat diferitele opțiuni de configurare care trebuie să fie instalate pentru încărcarea fișierelor. Apoi ne-am uitat la un exemplu din lumea reală care a demonstrat cum funcționează încărcarea fișierelor în PHP.

Sper că v-ați bucurat de acest articol și vă puteți trimite mai jos întrebările și sugestiile!

Cod