Descărcarea fișierelor în php, direktor

Multe resurse utilizează stocarea fișierelor. În plus față de capacitatea de a descărca și de a stoca fișiere, poate fi necesar să organizați descărcarea acestora. Este un lucru când fișierele sunt în domeniul public, dar atunci este posibil să fie necesar să transferați fișierul prin PHP. De exemplu, un administrator de resurse ar putea avea nevoie de informații despre numărul de descărcări. Pentru fișierele mari, aveți totuși nevoie de abilitatea de a relua, ceea ce este probabil cel mai dificil moment pentru serverele de servere. Să vedem cum puteți organiza activitatea scriptului în PHP, care vă permite să implementați toate caracteristicile de mai sus.







Să începem printr-o metodă simplă. Lăsați scriptul nostru să obțină numele fișierului prin oricare dintre parametrii interogării. Acesta poate fi într-adevăr tastat URL, și poate, de asemenea, rescrise de către server cu ajutorul mod_rewrite. Scriptul numește funcția file_download () cu parametrul $ filename. În plus față de directe cererea de transport $ filename poate fi, de asemenea, calculate pe baza identificatorul sursă al cererii sau completate de către directorul server din copac.

Cea mai ușoară modalitate de a face față cererilor de fișiere descărcate este pur și simplu să le redirecționați.

funcția file_download # 40; $ filename # 41; # 123;
// Verificați existența fișierului
dacă # 40; file_exists # 40; $ filename # 41; # 41; # 123;
// Aici scriem codul care se va ocupa de încărcarea fiecărui fișier.

// Redirecționați clientul către fișier.
antet # 40; 'Locația:'. $ filename # 41; ;
# 125; altfel # 123;
// Dacă fișierul nu este găsit, informați clientul prin intermediul antetelor HTTP
antet # 40; $ _SERVER # 91; "SERVER_PROTOCOL" # 93;. '404 nu a fost găsit' # 41; ;
antet # 40; 'Status: 404 Nu a fost găsit' # 41; ;
# 125;
// Întrerupem execuția ulterioară a scriptului, astfel încât să nu trimitem gunoi ca răspuns la client
ieșire;
# 125;

Acest lucru va necesita complicarea funcției noastre de descărcare.

funcția file_download # 40; $ filename. $ mimetype = 'aplicație / octet-stream' # 41; # 123;
dacă # 40; file_exists # 40; $ filename # 41; # 41; # 123;
// Trimiteți antetele necesare
antet # 40; $ _SERVER # 91; "SERVER_PROTOCOL" # 93;. "200 OK" # 41; ;
// Tipul conținutului. Pot fi luate din anteturile primite de la client
// când încărcați fișierul pe server. Poate fi obținută utilizând extensia PHP Fileinfo.
antet # 40; 'Content-Type:'. $ mimetype # 41; ;
Data ultimei modificări a dosarului
antet # 40; 'Last-Modified:'. gmdate # 40; 'R'. filemtime # 40; $ filename # 41; # 41; # 41; ;
// Trimiteți identificatorul unic al documentului,
// valoarea cărora se modifică atunci când este schimbată.
// În codul de mai jos, calculul acestui antet se face în același mod,
// ca în software-ul de server Apache
antet # 40; 'ETag:'. sprintf # 40; '% x-% x-% x'. fileinode # 40; $ filename # 41;. filesize # 40; $ filename # 41;. filemtime # 40; $ filename # 41; # 41; # 41; ;
// Dimensiunea fișierului
antet # 40; 'Conținut-Lungime:'. # 40; filesize # 40; $ filename # 41; # 41; # 41; ;
antet # 40; "Conexiune: aproape" # 41; ;
// Numele fișierului, deoarece acesta va fi salvat în browser sau în programul de descărcare.
// Fără acest antet, va fi folosit numele de bază al scriptului PHP.
// Dar acest antet nu este necesar dacă folosiți mod_rewrite pentru






// redirecționează cererile către server către un script PHP
antet # 40; "Conținutul-Dispoziție: atașament; nume fișier # 40; $ filename # 41;. ""; " # 41; ;
// Returnați conținutul fișierului
echo file_get_contents # 40; $ filename # 41; ;
# 125; altfel # 123;
antet # 40; $ _SERVER # 91; "SERVER_PROTOCOL" # 93;. '404 nu a fost găsit' # 41; ;
antet # 40; "Status: 404 Nu a fost găsit" # 41; ;
# 125;
ieșire;
# 125;

funcția file_download # 40; $ filename. $ mimetype = 'aplicație / octet-stream' # 41; # 123;
dacă # 40; file_exists # 40; $ filename # 41; # 41; # 123;
antet # 40; $ _SERVER # 91; "SERVER_PROTOCOL" # 93;. "200 OK" # 41; ;
antet # 40; 'Content-Type:'. $ mimetype # 41; ;
antet # 40; 'Last-Modified:'. gmdate # 40; 'R'. filemtime # 40; $ filename # 41; # 41; # 41; ;
antet # 40; 'ETag:'. sprintf # 40; '% x-% x-% x'. fileinode # 40; $ filename # 41;. filesize # 40; $ filename # 41;. filemtime # 40; $ filename # 41; # 41; # 41; ;
antet # 40; 'Conținut-Lungime:'. # 40; filesize # 40; $ filename # 41; # 41; # 41; ;
antet # 40; "Conexiune: aproape" # 41; ;
antet # 40; "Conținutul-Dispoziție: atașament; nume fișier # 40; $ filename # 41;. ""; " # 41; ;
// Deschideți fișierul de căutare
$ f = fopen # 40; $ filename. 'R' # 41; ;
în timp ce # 40; feof # 40; $ f # 41; # 41; # 123;
// Citiți blocul kilobyte, puneți-l în ieșire și resetați-l la tampon
echo fread # 40; $ f. 1024 # 41; ;
culoare # 40; # 41; ;
# 125;
// Închideți fișierul
fclose # 40; $ f # 41; ;
# 125; altfel # 123;
antet # 40; $ _SERVER # 91; "SERVER_PROTOCOL" # 93;. '404 nu a fost găsit' # 41; ;
antet # 40; "Status: 404 Nu a fost găsit" # 41; ;
# 125;
ieșire;
# 125;

Încă mă gândesc la asta. Termenul de execuție a execuției scriptului PHP poate fi setat mai mult.
Încă nu am prins un astfel de bug. deși a încercat.

Expirarea scenariului? mmm. trebuie să legeți temporar limitele la adresa IP. uh. dar fișierele sunt de la 1 Mb la 200. Da, și viteza tuturor este diferită. Cineva pe vydelenke, și pe cineva pe dialak. Nu-mi pot imagina cum să calculeze timpul de expirare în aceste condiții.
Înțeleg că nu este o problemă, ci o lucrare normală de scriere. Atunci când antetul este redirecționat, scriptul nu mai funcționează (pare logic), desigur, în același timp invocând funcția de închidere, care elimină eticheta pentru firul care există de fapt. = (
Administratorul serverului se odihnește și nu dorește să taie în mod special utilizatorii enervanți nici la nivelul Apache, nici în fața acestuia (să spunem, iptables). În general, trebuie să o faceți programat cumva. Totul a făcut deja. și htaccess tricky a scris, cu redirecționări și cookie-uri de control, și redirecționarea către un script cu fire. Singurul lucru pe care plug-in-ul - elimina prematur marcaje de flux. = (

Sunt inactiv. ) Nu am realizat imediat că redirecționarea va închide conexiunea. Atunci nu vor putea folosi în această situație. Când redirecționarea fișierelor este disponibilă direct și numărul de fire poate fi limitat numai prin Apache. În fișierele httpd.conf sau .htaccess există un astfel de parametru. Și prin intermediul PHP doar dă fișierul prin scenariu. Apoi, există o garanție că scriptul este executat în timp ce descărcarea este în desfășurare.

Iată un altul.
Puteți încerca titlul Conexiune: Mențineți-viu
Nu am timp să testez încă, o să ajung la serverul de fișiere numai în week-end, dar poate că va fi îngropat aici câinele. Este necesar să rumați în RFC.

Funcțiile vor fi: să limiteze viteza de descărcare pentru utilizatorii anonimi, să returneze fișierul în mai multe fluxuri cu abilitatea de a relua și de a descărca parțial, de a limita numărul de astfel de fluxuri.

Există multe momente subțiri: controlul activității de conectare, prelucrarea și susținerea cererilor parțiale GET.
Pe baza rezultatelor, voi scrie note. În general, după o săptămână sau două sau trei.

=) De asemenea, a decis să scrie un feedback de program. Dar pe rapid, pe genunchi. )) Avem cumva acces la fișiere pentru unii oameni.

>> Există un astfel de parametru în fișierele httpd.conf sau .htaccess.
Deci asta și asta, că în htaccess nu este prezent. Există doar în Apache și tcp / ip, dar adminul nu este prea vechi.
Sugerează să schimbe vds-ul pentru a dedica. Nu înțeleg că este viclean sau leneș))

Bună ziua!
Vă mulțumesc foarte mult pentru articolele dvs. utile!
Ajutați-vă să înțelegeți următoarea problemă.

Folosesc formularul pentru a transmite parametrii pe o altă pagină download.php
În care ultima funcție din acest articol este înregistrată și după lansare
file_download (nume fișier $);

Spuneți-mi de ce, în loc de a descărca un fișier, acesta își deschide codul în browser.

Verificați ce antete primează browserul dvs. Anteturile specificate în funcție trebuie trimise la fișierul care trebuie descărcat. Dacă acestea nu sunt transferate - sapă pe partea serverului







Articole similare

Trimiteți-le prietenilor: