PHP: încărcarea unui fișier pe server
Descărcarea fișierelor prin PHP este un lucru foarte interesant, ar trebui să o abordați foarte atent. Pe Internet, puteți găsi multe exemple de implementare a descărcărilor de fișiere, dar nu toate sunt bune și respectă regulile de securitate.
conținut
Astfel de lucruri trebuie să fie aduse la sfârșit, chiar dacă durează mult timp. Dacă lăsați o gaură în cod, atunci întregul dvs. server poate fi în pericol.
siguranță
Folosind PHP descărcarea fișierelor pe server este destul de ușor. Codul este foarte scurt și simplu. Doar câteva linii. Dar o astfel de metodă este periculoasă. În cazul în care mai mult timp și linii de cod merge la securitate.
Pericolul este că, dacă nu faceți nicio verificare, orice atacator va putea să-și descarce scripturile pe serverul dvs. În acest caz, el va avea acces complet. El poate face orice vrea:
- șterge baza de date;
- ștergeți fișierele de site
- modificați fișierele site-ului;
- adăugați anunțurile pe site-ul dvs.
- descărcați viruși;
- să redirecționeze toți utilizatorii la site-urile lor;
- și mult mai mult ca să vină în minte hoțul.
Întotdeauna trebuie să verificați ce utilizatori încearcă să încarce pentru fișier. Dacă, de exemplu, încărcați numai fotografii, trebuie să verificați dacă acest fișier este exact imaginea. În caz contrar, veți fi descărcat orice.
Cât de precis va implementa testul va fi afișat mai târziu, atunci când luați în considerare direct scriptul de descărcare a fișierului.
Crearea unui formular PHP
Formularul de descărcare a fișierului arată foarte simplu. Suficient butoane de navigare și butoane de descărcare.
Nu vom descrie crearea formularului, deoarece este ușor. Instrucțiunile suplimentare presupun că aveți deja conceptele de bază despre HTML (altfel nu ar trebui să căutați informații despre încărcarea în PHP).
Dar rețineți că pentru a transfera date în formă, trebuie să adăugați atributul enctype.
În caz contrar, datele despre dispozitivul de tratare a fișierelor nu vor fi transmise.
Cum ar trebui să funcționeze acest lucru?
Când faceți clic pe butonul de navigare, ar trebui să deschideți o fereastră, unde vi se va cere să selectați un fișier.
După aceasta, ar trebui să apară calea unde este localizat fișierul.
Dacă calea nu apare, faceți acest lucru din nou.
După ce faceți clic pe butonul de descărcare, orice informație poate fi transmisă de fișierul handler.
De exemplu, puteți scrie o linie care spune că un fișier cu un nume "așa-și-așa" a fost încărcat cu succes într-un folder "așa-și-așa". Desigur, numele fișierului va fi întotdeauna diferit.
De obicei, aceste informații detaliate sunt folosite pentru a depana codul. În acest fel, puteți verifica dacă datele sunt transferate și înregistrarea se îndreaptă către directorul de care aveți nevoie. Asta este, chiar și numele fișierului nu indică. Deoarece aceasta este o informație suplimentară pe care utilizatorul nu o are nevoie.
Este logic să transmiteți date despre nume numai dacă utilizatorul descarcă mai multe fișiere. Vom examina acest caz un pic mai departe. Nu vom merge mai departe.
ajustare
În PHP, încărcarea unui fișier pe un server necesită să se facă anumite setări în fișierul php.ini. Există o mulțime de setări în acest fișier. Toți nu avem nevoie de ei. Suntem interesați de trei linii: file_uploads, upload_tmp_dir și upload_max_filesize.
Rețineți că aceste setări vor afecta toate site-urile dvs. de pe server, nu doar unul dintre ele. Prin urmare, setați dimensiunea maximă în funcție de ceea ce veți încărca utilizatorii. Nu se recomandă setarea unor valori prea mari.
După ce modificați valorile din aceste setări, serverul trebuie să fie repornit. În caz contrar, setările nu vor avea efect, deoarece sunt citite în momentul încărcării serverului.
Puteți face acest lucru în consola prin conectarea prin SSH la server. Este suficient să introduceți serviciul de comandă httpd restart și apoi setările vor intra în vigoare.
O altă modalitate este să reporniți prin panoul ISP sau prin panoul de facturare al furnizorului.
Array cu fișier
În PHP, fișierul este încărcat utilizând matricea $ _FILES. Acesta conține toate informațiile despre fișierele pe care le descărcăm.
Pentru a vedea ce fel de informații este conținută în această matrice, este suficient să scrieți următoarele în fișierul handler.
Selectați orice fișier și faceți clic pe "Descărcați". Pagina handler afișează informațiile stocate în fișierele $ _FILES. Variabila este scrisă complet cu litere mari. PHP este un limbaj sensibil la caz.
După cum puteți vedea, există multe câmpuri în acest tablou. Toate acestea sunt importante pentru noi. Primul câmp stochează numele fișierului în forma în care este utilizat pe computer.
Coloana de tip indică tipul de fișier. Câmpul tmp_name corespunde numelui fișierului temporar. După finalizarea scriptului, acesta va fi șters.
Câmpul de eroare stochează codul de eroare. Despre acest lucru mai departe. Dimensiune - mărime în octeți.
erori
Descărcarea unui fișier prin PHP este întotdeauna însoțită de un cod de eroare. Mesajul de eroare este inclus în câmpul "eroare". În screenshot, eroarea este zero.
Luați în considerare valorile tuturor erorilor:
Deasupra sa spus despre parametru, care poate fi specificat în HTML normal.
Iată un exemplu de formular pentru încărcarea unui fișier, unde este specificată o limită în mărimea fișierului încărcat.
PHP: script de descărcare de fișiere
Cum se face totul în practică? În PHP, fișierul este descărcat utilizând comanda de copiere. Dacă ați fost interesat de întrebarea cum să încărcați un fișier, atunci răspunsul este pur și simplu copiați, care utilizează doi parametri - fișierul sursă și fișierul de destinație.
Dar, așa cum am menționat mai sus, acest lucru nu poate fi limitat din motive de securitate. De exemplu, pentru a verifica tipul de fișier pe care îl expediem, putem folosi tipul de câmp în matricea $ _FILES. În primul rând, o să ne dăm seama printr-un test și apoi vom trece la scenariul complet
Să presupunem că doriți ca utilizatorii să încarce o fotografie cu rezoluția numai GIF, JPEG sau PNG. Puteți specifica astfel.
dacă {$ _ FILES [`file_upload`] [`tip`]! = "imagine / gif") {
ecou "Ne pare rău, avem suport pentru descărcarea numai a fișierelor Gif" -
exit-
}
Dacă doriți să expediați toate cele 3 tipuri, pur și simplu adăugați o condiție suplimentară cu un alt tip de imagine.
Copierea se face astfel: Copiați (fișierul 1, fișierul 2).
În cazul nostru, când lucrarea continuă cu descărcarea de pe computer la server, puteți face acest lucru
copiați ($ _ FILES [`file_upload`] ["nume_tmp"], "1.jpg")
Adică, fișierul va fi copiat cu numele 1.jpg. Acest lucru nu este complet corect. În acest caz, acesta este doar un exemplu. Numele fișierului trebuie să fie întotdeauna setat diferit, iar extensia trebuie specificată în funcție de fișier.
Puteți defini extensia în mai multe moduri. Totul depinde de erudiția dezvoltatorului. Una dintre cele mai rapide căi (diferența în zecimi de secunde) de definire a unei extensii este următorul cod.
$ path_info = caleinfo ($ _FILES [`photo1`] ["nume"]);
$ ext = $ cale_info [`extensie`];
În variabila $ ext vom stoca extensia necesară. Și numele fișierului poate fi setat aleator folosind md5. Dacă intenționați să descărcați mai multe fișiere, este mai bine să le încărcați în foldere diferite. Deci, va fi mai convenabil. Mai ales dacă doriți să curățați.
Codul de descărcat va fi după cum urmează.
/// disponibilitatea fotografiilor
dacă ($ _FILES [`photo1`] [`tmp_name`] == null)
{
echo ("
Fișierul nu este specificat.
") -ieșire;
}
///. Să presupunem că aveți permisiunea de a încărca fișiere mari (video) pentru un proiect pe server, dar vor exista doar fotografii și că utilizatorii trebuie să limiteze
dacă {($ _FILES ["photo1"] ["size"]> 1024 * 1024 * 2)
{
?>
Dimensiunea maximă permisă a imaginii 2 MB
ieșire;
}
// crea dosare
// creați dosarul lunii curente
dacă (!! file_exists ("img /". date ("M")))
{
mkdir ("img /". dată ("M"));
}
// creați un dosar al zilei curente
dacă (!! fișier_există ("img /". dată ("M") "/"
{
mkdir ("img /". data ("d"));
}
/// extensie de fișier
$ path_info = caleinfo ($ _FILES [`photo1`] ["nume"]);
$ ext = $ cale_info [`extensie`];
/// generează numele fișierului
$ id = md5 (data ("Y-M-d"));
în cazul în care (copie ($ _ FILES [ `photo1`] [ "tmp_name"], "img /". Data ( "M"). "/". data ( "d"). "/". $ id. $ ext) )
{
ecou ("fișierul descărcat cu succes");
}
/// orice alte acțiuni (scrierea în baza de date etc.)
}
Fișiere multiple
Descărcarea mai multor fișiere (PHP) apare utilizând câmpuri suplimentare în formular.
Această metodă nu este foarte bună, deoarece limitează numărul de fișiere de descărcat. Mai mult, este considerat un ton rău în programare. Încercați să faceți totul dinamic.
Opțiunea ideală este capacitatea de a selecta simultan un număr mare de fișiere prin apăsarea unui singur buton.
Pentru a face acest lucru, vom crea formularul cu acest cod.
Rețineți că cuvântul multiplu este adăugat, iar numele este specificat ca array []. În acest caz, matricea $ _FILES va fi puțin diferită. Veți obține o matrice în matrice.
Pentru verificare, puteți utiliza din nou var_dump ($ _ FILES);
Toate fișierele dvs. vor fi amplasate în matrice, astfel:
- $ _FILES ["file1"] ["nume"] [0]
- $ _FILES ["fișier1"] ["nume"] [1]
- Și așa mai departe.
În paranteze, numărul fișierului din matrice este scris. Numărătoare de la zero. Noi le procesăm în același mod, setăm doar bucla și, la accesarea codului de mai sus, adăugăm indexul [$ i] la sfârșit.
$ i = 0;
în timp ce ($ _FILES ["file1"] ["nume"] [$ i]<> ``)
{
/// introduceți codul de mai sus
}
Astfel, va trebui să descărcați fișierele prin PHP într-un singur ciclu, fără repetarea inutilă a codului, așa cum se întâmplă de obicei dacă utilizați opțiunea numărului de fișier static (ultima fotografie).
- Cum să plasați site-ul pe Internet?
- Detalii despre ceea ce este pe serverele FTP
- Ce este FTPS: principiul funcționării și diferențele față de FTP convenționale
- Ce este acest program - Mipony? Cum se utilizează?
- Portul FTPS - ce este?
- Care este eroarea de 500 de erori interne? Ce se întâmplă dacă ați văzut inscripția 500 Server de…
- Cum in "MTA" pentru a crea un server pentru prieteni?
- În detaliu, despre verificarea integrității cache-ului în "Steam"
- Cum se conectează la server: recomandări
- Nu există nicio legătură cu serverul "Sharemann": ce trebuie să faceți?
- Care sunt funcțiile serverului LAN? Setarea lui
- Programe FTP: Prezentare generală a clienților pentru Windows
- Detalii despre modul de autorizare în "Maincraft" pe server
- WoT nu este actualizat: cum se rezolvă problema?
- Eroare Shareman `nici o conexiune la server`: ce să fac?
- Protocolul FTP
- Cum să vă creați propriul server
- Cum se utilizează Putty: comenzi și funcții utile
- Ce ar trebui să fac dacă limita de descărcare pentru fișierul Yandex Disk este depășită?
- Cum de a crea singur un server FTP?
- Ce oferă serverul VPN Windows 7?