Consolidarea fișierelor php. Vederea eficientă a fișierelor pentru ajutor PHP

Consolidarea fișierelor php. Vederea eficientă a fișierelor pentru ajutor PHP

Dar pe cob, aș dori să spun câteva cuvinte despre acestea, cum sunt luate fișierele.

Pentru cine avem nevoie formular html cu tipul câmpului de intrare . În plus, pentru a transfera fișiere pe server, trebuie să formați tipul de inserare multiparte. Pentru care parametru enctype indica sensul multipart/form-data.

După aceea, ca și pe partea html, vom extinde formularul cu câmpul Fereastra browserului va afișa un câmp care vă permite să selectați un fișier pe computerul local.

După aceea, yak koristuvach vibere fișierul necesarși apăsați butonul „Trimiteți” formularul pentru a trimite datele script php către serverul specificat în acțiune formă. Dacă formularul de acțiune este gol, datele vor fi transferate în același fișier pe care este cunoscut formularul. Toate informațiile despre fișierul care este învins, mutate în matrice $_FILES. Trebuie să colectăm aceste informații și să mutăm fișierul în locul de care avem nevoie.

Mai întâi, procedați înainte de a scrie scriptul de procesare formă cu mai multe părți trebuie să editați fișierul de configurare php.ini pentru a permite încărcarea fișierelor pe server.

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

  • file_uploads = Activat - permite încărcarea fișierelor pe server în spatele protocolului HTTP;
  • upoad_tmp_dir = /tmp – configurați un director pentru colectarea în funcție de timp a fișierelor dispărute;
  • upload_max_filesize = 2M - setează numărul maxim de fișiere care vor fi încărcate.

Otzhe, creează un fișier nou din im'yam upload.phpși copiați-l într-un cod nou.

Cum să te minunezi cu respect de formă, mângâi pe teren

Vono arată spre expansiune maximă fișier, care este acceptat în octeți. Dar nu ai încredere în acest sens, care este mai mult decât un simplu memento și îl poți ignora cu ușurință! Așa că ia-o ușor!

După aceea, după ce ați selectat fișierul și făcând clic pe butonul „Obțineți”, toate informațiile despre fișier, așa cum se credea anterior, sunt plasate în matricea $_FILES, iar fișierul în sine este plasat în directorul de timp de pe server, care este instruit de php.ini.

Fișierul de câmp Oskіlki a fost numit name="uploadFile", atunci tabloul $_FILES este un tablou asociativ cu cheia "incarca fisier" .

  • $_FILES["uploadFile"]["name"] - numele fișierului înainte de încărcare pe server, de exemplu, pict.gif;
  • $_FILES["uploadFile"]["size"] - dimensiunea fișierului primit în octeți;
  • $_FILES["uploadFile"]["type"] - tip MIME al fișierului primit (astfel încât browserul să-l poată schimba), de exemplu: imagine/gif, image/png, image/jpeg, text/html;
  • $_FILES["uploadFile"]["tmp_name"] - ștergeți numele fișierului din directorul de timp, de exemplu: /tmp/phpV3b3qY;
  • $_FILES["uploadFile"]["error"] - Codul grațierii, astfel încât să puteți da vina pe fișierul încărcat pentru o oră.

După finalizarea script-ului robot, fișierul de timp va fi șters. Tse înseamnă că suntem responsabili pentru copierea yoga în alt loc înainte de finalizarea scenariului robotului.

Așa că am scăpat de algoritm! Acum să ne uităm la cod.

Înaintea mea, credem că a fost apăsat butonul de trimitere.

If(isset($_POST[„încărcare”])) ( )

If(is_uploaded_file($_FILES["uploadFile"]["tmp_name"])) ( Hacking peste fișier ) else ( echo "Fișierul nu a fost încărcat"; )

La fel ca un fișier de solicitare prin HTTP POST, apoi îl mutăm din directorul de timp în directorul de care avem nevoie. Ar trebui să încercați să obțineți ajutorul funcției move_uploaded_file, deoarece acceptă doi parametri: numele fișierului de încărcat și calea în care va fi mutat fișierul. Odată ce fișierul este mutat cu succes, această funcție va fi setată la adevărat, în caz contrar - false.

If(move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $uploadedFile)) ( echo Încărcare fișier; ) else ( echo Fișierul a fost scuzat de la momentul încărcării; )

În cazul nostru, ca fișier, fișierul este afișat ca fișier de timp pe server - $_FILES["uploadFile"]["tmp_name"], iar ca director, unde va fi mutat fișierul - schimbați $uploadedFile, ca bula a fost exprimată mai mult în script și șterg o nouă locație pentru salvarea fișierului.

$folder = "cale/la/dosar/"; $uploadedFile = $dosar. nume de bază($_FILES["uploadFile"]["nume"]);

Din câte știu, pot spune că voi păstra numele original al fișierului pe server, nu varto, astfel încât să îl puteți redenumi. Pentru a genera un nume personalizat pentru fișierul nostru, utilizați funcția move_uploaded_file() pentru a muta și redenumi fișierul nostru:

// Necesită extensia fișierului $file_ext = strtolower(strrchr($_FILES["uploadFile"]["nume"],".")); // Generați un număr uniqid $ file_name = uniqid(rand(10000,99999)); // Căi formate pe server $uploadedFile = $folder.$file_name.$file_ext;

Ei bine, în sfârșit voi face o listă posibile grațieri, care dă vina pe ora de descărcare a fișierelor pe server. Cred că codul de grațiere este salvat în modificarea $_FILES["uploadFile"]["error"]:

  • 0- Iertarea nu a fost acuzată, fișierul a fost solicitat cu succes serverului.
  • 1- Dimensiunea fișierului primit prin modificarea dimensiunii maxime permise, care este stabilită de directiva upload_max_filesize a fișierului de configurare php.ini.
  • 2- Extindeți fișierul care urmează să fie capturat prin modificarea valorii MAX_FILE_SIZE, indicații pentru formularul HTML.
  • 3- Zavantazhuvany dosar Bulo otrimano rareori chastkovo.
  • 4- Dosarul nu are o ofertă.
  • 6- Nu părăsi folderul echipei.
  • 7- Ultima oră pentru scrierea fișierelor pe disc.

Ce zici, organizarea încărcării fișierelor pe server nu este atât de ușoară. Folder pentru a asigura nivelul necesar de securitate, fragmentele de captură de fișiere de pe server pot fi atacate de răufăcători pentru a ataca serverul.

Pentru ajutorul scârțâitului nostru, atacatorul poate încărca fișiere suplimentare pe server, de exemplu, puteți încărca un script php pe server, care vă poate șterge recursiv toate fișierele de pe server sau PHP-shell, astfel încât să vă puteți scrie propriile fișiere încărcate, apoi mergi serios până la ceea ce este necesar, fără să spui nimic.

În cazul nostru, nu îmi stabilesc o astfel de sarcină, ci mai degrabă arătându-vă întregul mecanism de încărcare a fișierelor pe server, iar în articolul următor, vă voi arăta cum să vă asigurați nivelul de securitate necesar!

ID autor: Va iubesc prieteni. Cu o cantitate mică de statistici, știi cum să creezi un formular de trimitere pentru un fișier de pe site. Nu-mi permite să atașez imagini și alte fișiere la formular și să editez fișierele de pe server, acestea vor fi deja procesate. Hai să o facem.

Fișiere externe statistici de streaming pe care le puteți zavantazhity pe .

După crearea formularului, va exista un câmp pentru capturarea fișierului. De ce există un respect varto zvernuti? În primul rând, câmpul pentru suprascrierea unui fișier poate avea un tip special - type="fișier". În alt mod, fișierul poate fi editat doar în câmpul de solicitare, deci metoda GET pentru editarea formularului nu este posibilă, trebuie să modificați metoda POST - metoda = „post”. Ei bine, în al treilea rând, pentru formular, atributul special necesar enctype cu primele valori este enctype = multipart/form-data. Fără acest atribut, fișierul pur și simplu nu va fi încărcat.

Pe baza celor exprimate mai sus, codul nostru va fi cam așa:

< form class = "form-horizontal" method = "post" enctype = "multipart/form-data" action = "file.php" >

< div class = "form-group" >

< label for = "name" class = "col-sm-2 control-label" >Denumirea fișierului< / label >

< div class = "col-sm-8" >

< input type = "text" id = "name" class = "form-control" name = "name" placeholder = "Denumirea fișierului" >

< / div >

< / div >

< div class = "form-group" >

< label for = "file" class = "col-sm-2 control-label" >Fişier< / label >

< div class = "col-sm-8" >

< input type = "file" name = "file" id = "file" >

< / div >

< / div >

< div class = "form-group" >

< div class = "col-sm-offset-2 col-sm-8" >

< button type = "submit" id = "submit" class = "btn btn-primary" >Vidravitate< / button >

< div > < / div >

< / div >

< / div >

< / form >

Ca rezultat, luăm aproximativ următoarea formă:

Câmpul de încărcare a fișierelor nu arată foarte frumos, prote, funcționează fără probleme: fișierul poate fi atașat și încărcat pe server. La articolul următor, vom încerca să proiectăm frumos câmpul pentru capturarea fișierului, dar deocamdată vom verifica dacă fișierul se captează. De fapt, formularul va fi adăugat la fișierul file.php, care este specificat în atributul action. Să creăm fișierul.

Ultima actualizare: 1.11.2015

Pentru a încărca un fișier pe server, trebuie să generăm un formular cu parametrul enctype="multipart/form-data" și matricea $_FILES. Otzhe, hai să creăm un fișier upload.php cu adunarea:

atasament

Selectați fișierul:

Formularul este definit aici cu atributul enctype="multipart/form-data" . Formularul conține un câmp special pentru selectarea unui fișier.

Toate fișierele care vor fi capturate sunt puse într-o matrice asociativă $_FILES. Pentru a determina ce fișiere sunt implicate, puteți selecta construcția if: if ($_FILES)

Tabloul $_FILES este bidimensional. Putem căuta fișiere și căuta un fișier cu o cheie, care este căutat cu atributul name.

Oskіlki element zavantazhenna fișier pe formular poate name="filename" , atunci dani file Putem folosi ajutorul $_FILES["filename"].

Skin-ul fișierului obiect poate avea propriii parametri, așa că putem schimba:

    $_FILES["fișier"]["nume"] : numele fișierului

    $_FILES["fișier"]["tip"]: tip pentru fișier, de exemplu, imagine/jpeg

    $_FILES["fișier"]["dimensiune"] : dimensiunea fișierului în octeți

    $_FILES["fișier"]["tmp_name"] : numele fișierului de timp salvat pe server

    $_FILES["fișier"]["eroare"]: codul de iertare pentru ora de încărcare

De asemenea, putem inversa aspectul grațierilor pentru ceasul încurcăturii. Deoarece nu avem scuze, câmpul $_FILES["filename"]["error"] este setat la UPLOAD_ERR_OK .

Când fișierul este încărcat pe server, acesta va începe să se miște în fusul orar, așa că vom muta_uploaded_file() pentru ajutor, se va muta în directorul serverului.

Funcția move_uploaded_file() acceptă doi parametri pentru calea către fișierul de timp încărcat și calea în care ar trebui să fie încărcat fișierul încărcat.

Obmezhennya și nalashtuvannya

Pentru fișierele extinse zamovchuvannyam, scho zavantazhuyutsya, 2 mb. Cu toate acestea, acest parametru poate fi configurat în fișierul de configurare. Schimbați acest afișaj, de exemplu, până la 10 megaocteți. Pentru cine cunoaștem dosarul php.ini rândul următor:

Upload_max_filesize = 2M

Să-l schimbăm în

Upload_max_filesize = 10M

De asemenea, putem crea un folder pentru fișierele de timp care vă interesează. Pentru cine fac dosarele php.iniștim următorul rând:

;upload_tmp_dir =

Să-l schimbăm în

Upload_tmp_dir = "C:/php/upload"

De asemenea, în directorul php, trebuie să creăm un folder de încărcare.

multifunctional

Schimbați scriptul upload.php deci, schob vіn pіdtrimuvav multiplicator zavantazhennya:

$eroare) ( dacă ($eroare == UPLOAD_ERR_OK) ( $tmp_name = $_FILES["încărcări"]["tmp_name"][$key]; $name = $_FILES["încărcări"]["nume"][$ cheie]; move_uploaded_file($tmp_name, „$nume”); ) ) ) ?>

atasament




Dacă câmpul pentru selectarea unui fișier are atributul name="uploads", atunci serverul va vizualiza colecția de fișiere editate ca o singură matrice.

Să repetăm ​​bucla foreach, parcurgând toate fișierele și luându-le din director pe site.

Browserul dvs. are blocare JavaScript. Permite JavaScript să funcționeze site-ul!

Încărcarea fișierelor pe server

Încărcarea are un scurt excursus

Ce sunt Încărcați fișiere, de ce să nu funcționeze
copy("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg")

Dacă aveți mai multe computere, pe care aveți atât un server, cât și o stație de lucru, nu uitați de cele care folosesc tehnologia php victorious client/server. Fișierul, pe care doriți să îl capturați, sună, recumpărați în mașina clientului, apoi. koristuvach, zvichaynogo vіdvіduvacha site. Locul recunoașterii este serverul. Pentru a finaliza procesul de transfer de fișiere, avem nevoie de următorul formular:

Trimiteți acest fișier:

Dacă da, câmpul de acțiune este responsabil pentru specificarea adresei URL a scriptului dumneavoastră php, care ar trebui să fie ocupată cu procesarea fișierelor care sunt interesate. Dacă este atașat câmpul MAX_FILE_SIZE, acesta poate fi transmis câmpului pentru a selecta fișierul și a seta dimensiunea maximă admisă a fișierului în octeți. Reaprobare - reverificarea expansiunii fișierului înainte de a trimite fișierul la server. Tse poate scuti coristuvacha de fișierul zavantazhennya banal și ineficient de pe serverul care a aprobat traficul zayvogo, dar nu vă bazați în mod special pe tse obmezhennya, astfel încât să fie ușor de ratat.

Cum arată dacă o persoană selectează un fișier de pe disc și apasă butonul „Trimite fișier”? Browserul trimite fisierul la server, de php-interpreter il plaseaza in propriul director de timp, atribuindu-l numelui fisierului si script-ului pictogramei, specificand in campul de actiune.

Cum pot vedea upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["nume"])) (printează "Fișierul este valid și a fost încărcat cu succes."; ) else ( tipăriți „Există unele erori!”; )

Când scrieți un scenariu, dați vina pe natura alimentelor: cum să luați informații despre interesele fișierului și să accesați fișierul în sine. Yakshcho Vikoristovuete versiuni PHP 4.1.0 și mai vechi, cel mai bine este să răsfoiți la matricea globală $_FILES. Pentru un fișier vin criptat pe piele, ștergeți matricea hash cu tributurile viitoare:

  • $_FILES[„fișierul utilizator”][„nume”]- numele original al fișierului, deci, yakim bachiv koristuvach, selectați fișierul;
  • $_FILES[„fișierul utilizator”][„tip”]- fișier mime/type, de exemplu, imagine/gif; salvați acest câmp dacă doriți să trimiteți o interfață pentru descărcarea fișierelor descărcate;
  • $_FILES["userfile"]["size"]- Fișier extins;
  • $_FILES["userfile"]["tmp_name"]- Calea Povniy către fișierul de timp de pe disc;
  • $_FILES[„userfile”][„eroare”]- Începând cu versiunea 4.2.0, resetați codul de grațiere, care este bun 0, deoarece operația a avut succes.

Pentru versiunile PHP mai mici decât 4.1.0, această matrice este numită $HTTP_POST_FILES. Nu uitați că pe vizualizarea $_FILES acest tablou nu este super-global și când mergeți la unul nou, de exemplu, din funcții, este necesar să specificați în mod explicit global $HTTP_POST_FILES;

De asemenea, în setările serverului register_globals=on, vor exista modificări suplimentare, vezi $userfile_name, $userfile_type, $userfile_size... duhoarea este destinată . Cea mai scurtă cale preluarea informațiilor despre fișierele care sunt dorite - selectați matricea $_FILES.

Pentru a lucra cu fișierele încărcate, cel mai bine este să utilizați funcțiile is_uploaded_file() și move_uploaded_file() pentru a verifica dacă fișierul este încărcat și a-l plasa în folderul specificat. Mai mult informatii detaliate Puteți ști pe părțile laterale ale ajutorului. Nu vă varto vin găsi o bicicletă și exersați-o singur cu fișierele de timp, copiați-le, vedeți. Tse deja zrobleno pentru tine că pentru tine.

Configurare server

Am făcut totul bine, dar nu lucrez în mine. Poate am configurat greșit serverul?

Dacă „ai făcut totul bine”, dacă codul tău nu funcționează sau funcționează greșit, nu te grăbi să te enervezi. Posibil, problema nu este în mâinile tale, ci în setările greșite ale serverului. Axis este o listă de directive care sunt folosite pentru a captura fișiere:

Pentru fișierul php.ini:

  • Dacă vrei să știi, redirecționează php.ini, vikoite
  • fișiere_încărcări- mozhlivist zagoroniti chi permite zavantazhennya fileіv zagalom. Pentru promoții On.
  • upload_max_filesize- dimensiunea maximă a fișierului care poate fi achiziționată. Dacă trebuie să lucrați cu fișiere grozave, modificați prețul remedierii. De obicei, 2M. Nu uitați să schimbați post_max_size.
  • dimensiunea_max- zagalne obezhennya zvehu rozmіr danih, transferat din cererea POST. Dacă trebuie să lucrați cu fișiere grozave sau să transferați un fișier mic deodată, modificați prețul fișierului. Valoarea pentru blocare este 8M.
  • upload_tmp_dir- Directorul Timchas de pe server, unde vor fi plasate toate fișierele care vor fi preluate. Revers, de parcă i s-ar fi pus drepturile (ca și în această etapă, ai fost acuzat de pliere, minune-te de explicația articolului). Un astfel de director poate fi folosit în coristuvacha, sub care Apache este învingător, deci poate avea și drepturi de scriere pentru acest director. Dacă lucrați la îmbunătățirea schimbului open_basedir, atunci directorul de timp este de vină pentru că se află la mijloc. Nu trebuie să vă faceți griji cu privire la curățarea sau unicitatea numelor, PHP rezolvă această problemă pentru dvs.

La dosar httpd.conf:

  • Persh pentru tot, răzgândiți-vă că piratați serverul web Apache 1.3 ( varianta rest la momentul redactării articolului - 1.3.27). Pe măsură ce susțineți Apache 2.0, ar trebui să citiți următorul fragment de document:

    Nu puteți pirata Apache 2.0 și PHP în procesul de creare a unui mediu comun pe Unix sau pe Windows.

  • De asemenea, ați omis promptul „Metoda POST nu este permisă”, ceea ce înseamnă că este necesar să glumiți, similar cu următoarea directivă, și să glumiți cuvânt cheie permite: Comanda permite, refuza Permite tuturor
  • Probleme cu descărcarea fișierelor binare - motivul clasic pentru „de ce sunt încărcate fișierele”. Axa modului de rezolvare, propunere de Dima Borodin (http://php.spb.ru): În director, plasați scriptul, fișierul robimo .htaccess, în care scriem: CharsetDisable On În fișier httpd.conf adăugați rânduri: CharsetRecodeMultipartForms Dezactivat

O mică explicație, la această rețetă: problema este mai semnificativă, dacă arhivele nu sunt extrase pe server și imaginile nu sunt afișate, se poate pune vina pe seama celor care sunt arhivate de serverul web rus Apache. Directiva CharsetDisable activează modulul de procesare a seturilor de caractere, deci. nu va exista nicio recodificare la descărcarea fișierelor care se află în acest folder. Directiva CharsetRecodeMultipartForms imită recodificarea datelor trimise prin metoda POST cu antetul Content-Type: multipart/form-data. Tobto. Datele duble, transferate la astfel de modificări, vor fi lăsate afară în vizualizarea cob, iar antetul site-ului web va fi recodat la modificările de streaming ale serverului.

Dar ei pot justifica complicația: fiți pregătiți pentru faptul că în anumite tipuri de părți textuale ale băuturii se întâmplă să recodați singur. Axa căreia unitate poate fi găsită în documentație:

Utilizați directiva CharsetRecodeMultipartForms, așa cum a fost introdusă în PL23, dar tot trebuie să recodați manual porțiunile de text ale intrărilor. Pentru care puteți pirata API-ul Apache rusesc, disponibil în alte module, sau API-ul Apache Perl rusesc, disponibil de la mod_perl.

Puteți găsi unul dintre exemplele de codare specifică aici: http://tony2001.phpclub.net/detect_charset/detect.phps

Cea mai recentă documentație pentru Apache rusesc poate fi găsită pe site-ul său oficial: http://apache.lexa.ru/.

Nu uitați că după orice modificare de configurare trebuie să reporniți serverul web.

De asemenea, este posibil să ajustați parametrii Apach pentru ajutor. htaccess:

php_value upload_max_filesize 50M php_value post_max_size 50M

Capacitate adăugată

Încărcarea unui număr de fișiere simultan

Culmea formei unei cereri pentru un număr de dosare:

Scrieți fișiere qi:


І nu uitați să creșteți dimensiunea_max, deoarece o mulțime de fișiere sunt transferate

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

Nu uitați că fișierele de pe hard disk sunt informații confidențiale, cu excepția JavaScript, și mai ales PHP, nu pot face nimic. Până la acea oră, în timp ce însuși koristuvach nu a selectat fișierul pentru ajutor despre iac, un robot nu poate lucra cu el. Nu uitați că acest câmp de intrare, atributul valoare, este protejat de înregistrare.

Salvarea fișierelor din baza de date mySQL

Dacă alegeți să salvați fișierele care sunt incluse în baza de date, trebuie să vă amintiți momentele care urmează:

  • Este necesar să piratați câmpul la tipul BLOB
  • Înainte de a-l pune în baza de date, nu uitați să zastosuvat până la un rând de mysql_escape_string ()
  • La momentul afisarii fisierului este necesara precizarea antetului continut/tip

Rețineți că scriptul care redă codul HTML nu interferează cu scriptul, care este responsabil pentru afișarea imaginii. Acestea se datorează a două programe diferite.

Să faci poze ca bază nu mai este un stil bun. Este mai bine să salvați pe baza unei căi mai mici către fișierele imaginii.

Obsesia pentru puterea imaginii.

Dacă doriți să schimbați tipul imaginii sau să redimensionați imaginea înainte de a încărca fișierul pe server, aveți nevoie de funcția getimagesize(). Ca argument, luați fișierul de pe disc și rotiți matricea, primele două elemente ale aceluiași - lățimea și înălțimea sunt adecvate, al treilea - tipul de imagine. În vremuri de imposibilitate de a citi imaginea corectă din fișierul alocat, funcția devine prostii.

Investigarea dosarelor, care poate fi un nume rusesc

Când încărcați fișiere pe server, este necesar să rescrieți numele lor originale, astfel încât caracterele „non-standard” să fie vizibile (de exemplu, litere rusești). În momentul prezenței lor, este necesar să se efectueze o înlocuire. Numele fișierului original poate fi găsit în modificarea $_FILES[„userfile”][“name”]. Puteți ști cum să recodificați șirul rusesc în transliterație în aplicațiile PHP.

Afișează bara de progres

Este necesar să aveți grijă ca fișierul PHP să nu poată fi gestionat de dimensiunea fișierului, nici de dimensiunea fișierului până când acesta este complet copleșit. Doar dacă fișierul se află deja pe serverul PHP, va fi posibil să se regăsească informațiile. Dacă tot trebuie să implementați această capacitate, grăbiți-vă cu un applet Java.

Drepturi la fișier

Probleme cu drepturile de server (upload_tmp_dir)

Pentru Unix-like sisteme de operare folderul skin, fișierul, mesajul au primit drepturi de acces. Mirosul poate arăta ca rwx-rw-r- sau numărul 754.

Disponibilitatea unui fișier sau a unui director pentru a fi stocat în numele ID-ului coristuvacha și ID-ul grupului, în care vinuri să intre. Modul întregului este descris în termeni de trei secvențe, câte trei litere pentru piele:

Grupul Vlasnik Inshі (u) (g) (o) rwx rwx rwx

Aici Vlasnik, membrii grupului și toți ceilalți coristuvachs pot avea dreptul de a citi dosarul, de a scrie celui nou și de a vikonnannya. Drepturi - dacă este înțeleasă combinația de litere ofensatoare:

r Citiți corect. (4)
w Permisiune de scriere. (2)
x Dreptul la vikonannya (cereți un catalog). (1)

  • Setați managerul de fișiere în directorul koristuvach, cu privilegiile căruia este instalat apache. Puteți verifica fișierul httpd.conf sau uitându-vă la lista de procese de pe server. Drepturile asupra directorului pot fi booty 700 (rwx------).
  • Indiferent de cine este proprietarul directorului, setați permisiunile la 777 (rwxrwxrwx).

    Un exemplu de implementare a captă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[„fișierul utilizator”])) ( if (fișierul_încărcat($_FILES[„fișierul utilizator”][”tmp_name”])) ( $filename = $_FILES[„userfile”][”tmp_name”]; $ ext = substr($_FILES[„fișier utilizator”][„nume”], 1 + strrpos($_FILES[„fișier utilizator”][„nume”], „.”)); if (dimensiune fișier($nume fișier) > $max_image_size ) ( echo „Eroare: Dimensiunea fișierului > 64K.”; ) elseif (!in_array($ext, $valid_types)) ( echo „Eroare: Tip fișier invalid.”; ) else ( $size = GetImageSize($filename); dacă (($dimensiune) && ($dimensiune< $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:
    "; }

    Articolul original poate fi găsit pe site-ul PHP Club


    Cum să iau un fișier de pe server?
  • Dacă trebuie să trimiteți fișierele nu direct către serverul web, ci pentru ajutor PHP (de exemplu, pentru a colecta statistici, vă cer o pisică.

    1. Victory readfile()

    Metoda este una bună, care funcționează din cutie. Trebuie doar să scrieți propria funcție pentru a forța fișierul (câteva modificări din documentația oficială):

    Funcția file_force_download($fișier) ( if (fișier_există($fișier)) ( // scăparea bufferului de vizualizare PHP pentru a distruge re-memoria scriptului pid văzut // astfel încât fișierul să nu poată fi recitit din nou în memorie! if ( ob_get_level( )) ( ob_end_clean(); ) // uimește browserul pentru a afișa fereastra de salvare în antetul fișierului ("Descrierea conținutului: Transfer de fișiere"); header("Tipul conținutului: aplicație/octet-stream"); ​​header("Conținut-Dispoziție: atașament;=" .basename($fișier)); header("Conținut-Transfer-Codificare: binar"); header ("Expiră: 0"); public"); antet(" Lungimea conținutului: " . dimensiunea fișierului ($fișier)); // citește fișierul și editează-l din nou readfile($fișier); ieșire; ) )
    În acest fel, puteți edita fișiere mari, astfel încât PHP să citească fișierul și să îl citească imediat pe părți. Documentația afirmă clar că readfile() nevinovat creează probleme din memorie.

    Caracteristici:

    • Fișierul este citit din bufferul intern al funcției readfile(), a cărei dimensiune devine 8kB (mulțumesc 2fast4rabbit)

    2. Citiți și editați manual fișierul

    Metoda de hacking a aceluiași Drupal atunci când depășește fișierele din private Sistemul de fișiere(fișierele nu sunt disponibile fără solicitări intermediare):

    Funcția file_force_download($fișier) ( if (fișier_există($fișier)) ( // scăparea bufferului de vizualizare PHP pentru a distruge re-memoria scriptului pid văzut // astfel încât fișierul să nu poată fi recitit din nou în memorie! if ( ob_get_level( )) ( ob_end_clean(); ) // uimește browserul pentru a afișa fereastra de salvare în antetul fișierului ("Descrierea conținutului: Transfer de fișiere"); header("Tipul conținutului: aplicație/octet-stream"); ​​header("Conținut-Dispoziție: atașament;=" .basename($fișier)); header("Conținut-Transfer-Codificare: binar"); header ("Expiră: 0"); public"); antet(" Lungimea conținutului: " . dimensiunea fișierului ($fișier)); // citiți fișierul și editați-l dacă ($fd = fopen($fișier, "rb")) ( în timp ce (!feof($ fd)) ( print fread( $fd, 1024); ) fclose($fd); ) ieșire; ) )
    Caracteristici:

    • Scriptul verifică până când întregul fișier este citit și citit koristuvachev.
    • Vă permite să economisiți memoria serverului

    3. Modulul server web Wicoristy

    3a. Apache
    Modulul XSendFile permite, pe lângă un antet special, să transferați puterea fișierului către Apache însuși. Utilizați versiuni pentru Unix și Windows, sub versiunile 2.0.*, 2.2.* și 2.4.*

    Pentru setările gazdei, este necesar să adăugați o modificare a antetului după o directivă suplimentară:
    XSendFile activat
    De asemenea, puteți furniza o listă mai mare de directoare ale căror fișiere pot fi procesate. Important: ca server bazat pe Windows, este de vină includerea literei unității în majuscule.

    Descrierea opțiunilor posibile pe site-ul retailerului: https://tn123.org/mod_xsendfile/

    Un exemplu de depășire a fișierului:

    Funcția file_force_download($fișier) ( if (fișier_există($fișier)) ( header("X-SendFile: " . realpath($fișier)); header ("Content-Type: application/octet-stream"); ​​​​header ("Conținut-Dispoziție: atașament; nume fișier=" . numede bază($fișier)); ieșire; ) )

    3b. Nginx
    Nginx poate edita fișiere din cutie printr-un antet special.

    Pentru o funcționare corectă, este necesar să blocați accesul la folder fără intermediar prin fișierul de configurare:
    locație /protejat/ (internă; rădăcină /unele/cale; )
    Un exemplu de forțare a unui fișier (fișierul trebuie învinovățit în directorul /some/path/protected):

    Funcția file_force_download($fișier) ( dacă (fișier_există($fișier)) ( header("X-Accel-Redirect: " . $fișier); antet ("Content-Type: application/octet-stream"); ​​​​header( „Conținut -Dispoziție: atașament; nume fișier=" .numede bază($fișier)); ieșire; ) )
    Mai multe informații pe partea documentației oficiale

    Caracteristici:

    • Scriptul se termină imediat ce toate instrucțiunile sunt terminate
    • Fizic, fișierul este gestionat de modulul serverului web în sine, și nu de PHP
    • Economii minime de memorie și resurse de server
    • Swidcode maxim

    Actualizați: Habrauser ilyaplot îmi face plăcerea de a trimite nu o aplicație/octet-stream, ci un adevărat fișier de tip mime. De exemplu, lăsați browserul să trimită nevoie de programeîn caseta de dialog pentru a salva fișierul.

     

     

    Tse tsikavo: