Încărcați fișiere, și tot în legătură cu acesta
Excursie scurt pentru a încărca
Chiar dacă aveți la dispoziție la un singur calculator, care combină atât server și stația de lucru nu trebuie să uităm că php utilizează o tehnologie client / server. Fișierul pe care dorim să descărcați, de obicei, situat pe masina client, și anume, utilizator, un vizitator obișnuit al site-ului. Destinație - server. Pentru a face procesul de transfer de fișiere, avem nevoie de formularul de mai jos:
În câmpul de acțiune ar trebui să fie o adresă URL de php-script, care va continua să fie implicate în procesarea fișierelor încărcate. MAX_FILE_SIZE câmp ascuns trebuie să preceadă câmpul de selectare a fișierului, și să păstreze în octeți dimensiunea maximă a fișierului. Scopul său - pentru a verifica dimensiunea fișierului, chiar înainte de a trimite dosarul la server. Acest lucru ar trebui să degreveze utilizatorul dintr-un fișier de încărcare lung și neroditoare la server și formarea de prea mult trafic, dar nu se bazează în special pe această restricție, deoarece este ușor pentru a obține în jur.
Ce se întâmplă atunci când utilizatorul selectează un fișier de pe disc, și faceți clic pe butonul „Trimite fișier“? Browserul trimite fișierul la serverul pe care PHP-interpret îl pune într-un director temporar, atribuindu-i un nume aleatoriu și execută script-ul specificat în câmpul de acțiune.
Cum ar trebui să arate upload.php?
Când scrieți scenariul, întrebarea se pune în mod natural: cum pentru a obține informații cu privire la fișierul descărcat și de a ajunge la dosar. Dacă utilizați PHP 4.1.0 și mai în vârstă, cel mai bine este să apeleze la matrice la nivel mondial $ _FILES. Pentru fiecare fișier descărcat, acesta conține o matrice hash cu următoarele informații:
- $ _FILES [ „userfile“] [ „nume“] - numele original al fișierului, cum ar fi el este văzut utilizatorul selectarea unui fișier;
- $ _FILES [ 'userfile'] [ 'tip'] - mime / tip de fișier, de exemplu, poate fi imaginea / gif; Acest câmp este util pentru a menține, în cazul în care doriți să ofere o interfață pentru descărcarea fișierelor descărcate;
- $ _FILES [ 'userfile'] [ 'dimensiune'] - dimensiunea fișierului descărcat;
- $ _FILES [ 'userfile'] [ 'tmp_name'] - calea completă către un fișier temporar pe disc;
- $ _FILES [ „userfile“] [ „eroare“] - De la versiunea 4.2.0, conține codul de eroare care este 0 în cazul în care operațiunea a avut succes.
În cazul în care dvs. setările de server register_globals = on, va crea variabile suplimentare ale formularului $ userfile_name, $ userfile_type, $ userfile_size ... Având în vedere că, începând cu versiunea 4.2.0, The register_globals setarea implicit = off folosind aceste variabile nu este recomandată, chiar dacă acestea identificate. Cel mai bun mod de a obține informații despre fișierele care pot fi descărcate - utilizați o matrice $ _FILES.
Pentru a lucra cu fișiere descărcate este cel mai bun de a utiliza funcțiile încorporate și is_uploaded_file move_uploaded_file, care verifică dacă fișierul a fost descărcat, și pune-l în folderul specificat, respectiv. Mai multe informații detaliate pot fi găsite în paginile de manual. Nu este necesar să se reinventeze roata și să lucreze la fișierele temporare, copiați-le, ștergeți-le. Acest lucru a fost făcut pentru tine și pentru tine.
Configurarea serverului
Am făcut totul bine, dar am ceva nu funcționează. Poate că nu am configurat un server?
Dacă „făcut totul bine“, dar codul nu este operațional, sau nu funcționează corect, nu se grăbesc să disperare. Poate că problema nu este în mâinile tale, dar în setările de server greșite. Aici este o listă a directivelor care au de a face cu descărcarea de fișiere:
- Dacă doriți să știți unde este dvs. php.ini, urmați
- file_uploads - posibilitatea de a preveni sau de a permite descărcarea de fișiere în general. Implicit On.
- upload_max_filesize - dimensiunea maximă a fișierului, care poate fi descărcat. Dacă aveți nevoie pentru a lucra cu fișiere mari, modificați această setare. Implicit 2M. Nu uitați să schimbați post_max_size.
- post_max_size - limita superioară generală cu privire la cantitatea de date trimise într-o solicitare POST. Dacă aveți nevoie pentru a lucra cu fișiere de dimensiuni mari, sau pentru a trimite mai multe fișiere dintr-o dată, modificați această setare. Valoarea implicită este 8M.
- upload_tmp_dir - director temporar pe server, care va fi plasat toate fișierele descărcate. Verificați ce a pus-dreapta (în cazul în care, în acest stadiu ai probleme, a se vedea explicația de la sfârșitul articolului). Acest director trebuie să existe și utilizatorul, sub care Apache, ar trebui să fie, de asemenea, dreptul de a scrie în acel director. Dacă lucrați cu restricție open_basedir pornit - directorul temporar trebuie să fie în interiorul. Nu aveți nevoie să vă faceți griji cu privire la curățarea acestuia, sau despre unicitatea numelor, PHP rezolvă această problemă pentru tine.
În fișierul httpd.conf:
- În primul rând, asigurați-vă că utilizați serverul web Apache 1.3 (cea mai recentă versiune a acestui scris ca - 1.3.27). Dacă utilizați Apache 2.0, ar trebui să citiți următorul fragment din documentația:
Nu utilizați Apache 2.0 și PHP într-un mediu de producție nici pe Unix, nici pe Windows.
explicație mică pentru această rețetă: această problemă specifică atunci când fișierele sunt încărcate pe server nu sunt despachetat și imaginile nu sunt afișate, nu se poate datora faptului că folosesc serverul web Apache rusesc. Directiva CharsetDisable dezactiva unitatea de modul de procesare a charset, și anume, nici o conversie atunci când nu se va produce descărcarea de fișiere în acest dosar. Directiva CharsetRecodeMultipartForms dezactivează transcodare de date, trimise prin metoda POST cu un antet Content-Type: multipart / form-date. Ie date binare transmise cu această setare, va fi lăsată intactă, iar conținutul restul site-ului vor fi convertite în funcție de setările de server curente.
Dar pot să apară la aceleași complicații: Fiți pregătiți pentru faptul că, în unele cazuri, va trebui să solicite textul re-encode propria lor. Asta se spune despre el în documentație:
Utilizați CharsetRecodeMultipartForms directivei, care a apărut în PL23, dar toate încă mai trebuie să codifica manual textul interogare. Puteți utiliza Rusă Apache API, disponibil în alte module sau rusă API Apache Perl, disponibil de la mod_perl.
Nu uitați că, după orice modificare de configurare, trebuie să reporniți serverul de web.
Caracteristici suplimentare
Vreau să fac doar un astfel de lucru, dar nu pot so fac.
Încărcați mai multe fișiere simultan
De fapt, în acest nu există nici o dificultate. Acest lucru se poate realiza prin utilizarea, de exemplu, că această formă:
Și nu uitați să crească post_max_size, în cazul în care aveți de gând o mulțime de fișiere
descărca în mod automat fișiere pe un server
Stocarea fișierelor într-o bază de date MySQL
Dacă aveți de gând pentru a stoca fișiere care pot fi descărcate în baza de date, trebuie să țină cont de următoarele puncte:
- Trebuie să utilizați un câmp de tip BLOB
- Înainte de a pune în baza de date, nu uitați să se aplice linia mysql_escape_string
- Dacă un fișier trebuie să fie specificat conținut de antet / tip
Amintiți-vă că afișează script-ul HTML nu are nimic de-a face cu script-ul, care este de a afișa imaginea. Ar trebui să fie două aplicații diferite.
Stocarea imaginilor în baza de date nu este un stil bun. Este mult mai convenabil pentru a fi stocate în baza de date numai calea către fișierul de imagine.
Prepararea proprietăților imaginilor.
Dacă a existat o sarcină în fața dumneavoastră pentru a verifica tipul sau dimensiunea imaginii înainte de a încărca un fișier pe server, aveți nevoie de o getimagesize funcție. Ca argument este nevoie de numele fișierului pe disc și returnează o matrice, primele două elemente care - lățimea și înălțimea, respectiv, iar al treilea - tipul de imagine. Dacă nu puteți citi imaginea corectă din fișierul specificat, funcția returnează false.
Încărcarea fișierelor cu numele de limbă rusă
Când descărcarea fișierelor de pe server, aveți nevoie pentru a verifica dacă numele lor originale pentru prezența de caractere „non-standard“ (de exemplu literele românești). În cazul în care este necesară prezența lor pentru o schimbare. Numele original al fișierului poate fi găsit în variabila $ _FILES [ „userfile“] [ „nume“]. Pentru o idee despre modul de a converti un șir de caractere într-o transliterare limba rusă pot fi găsite în fișierele de aproape orice forum dedicat php.
Afișează starea descărcării sau bara de progres
Fiți conștienți de faptul că pentru a finaliza descărcarea de fișiere, PHP nu se poate ocupa orice dimensiune de fișier sau procentajul de încărcare a acesteia. Numai atunci când fișierul este deja pe server PHP, acesta este capabil de a accesa informațiile. Dacă încă aveți nevoie pentru a realiza această posibilitate, utilizați Java-applet.
O scurtă schiță a dosarelor privind drepturile
Probleme cu permisiuni pe server (upload_tmp_dir)
În sistemele de operare * nix-cum ar fi, fiecare dosar, fișiere, linkuri pune drepturile de acces corespunzătoare. Acestea pot arata ca-rwx rw-r-, sau numărul 754.
Fișier sau director disponibilitatea depinde de ID-ul de utilizator și de grup ID, căreia îi aparține. în general, este descrisă în termeni de trei secvențe de trei litere fiecare:
Aici proprietarul, membrii grupului și toți ceilalți utilizatori au dreptul de a citi fișierul, scrie să-l și-l executa. Drepturile - orice combinație semnificativă dintre următoarele litere:
Pentru a încărca fișiere pe server pentru a funcționa corect, trebuie să pună în aplicare una dintre cele două opțiuni