Cum se deschide fișierele zip cu PHP

ThemeForest are o caracteristică frumoasă; Acesta permite autorilor să încarce fișiere zip care conțin capturi de ecran ale temelor lor. Un script apoi extrage aceste fișiere și afișează imaginile în consecință. Deși mă îndoiesc că dezvoltatorii au folosit PHP pentru a îndeplini această sarcină ... asta vom folosi!


Ce trebuie să facem

  • Creați un formular simplu de încărcare care permite utilizatorului să selecteze un fișier zip.
  • Asigurați-vă că utilizatorul alege un fișier zip și apoi salvați-l ca un fișier unic.
  • Extrageți conținutul din fișierul zip și salvați-l într-un anumit dosar.
  • Ștergeți fișierul zip și reluați conținutul.

Pasul 1: Crearea formularului de încărcare

  • Creați un fișier nou și salvați-l ca index.html în rădăcina soluției.
  • Apoi, vom construi un simplu formular. Lipiți următoarele în.
 

Ori de câte ori veți permite utilizatorilor să încarce fișiere, trebuie să setați "enctype" al etichetei de formular egal cu "/ Formular-date multipart". Apoi vom seta acțiunea egală cu aceeași pagină și metoda va fi egală cu postarea.

Pentru a păstra lucrurile pe cât posibil, avem doar o intrare de fișier și un buton de trimitere. Rețineți că am setat numele fișierului de intrare în "fupload". Vom utiliza în curând această valoare pentru a determina dacă pagina a fost sau nu postată înapoi.

Pasul 2: Scrierea PHP

În partea de sus a paginii dvs. index.php, înainte de declararea doctype, lipiți următoarele:

  

Să o luăm pas cu pas.

  • Dacă eticheta de intrare cu numele de "fupload" este setată, executați următorul cod, altfel nu faceți nimic.
  • Acum trebuie să creăm câteva variabile. Trebuie să capturăm numele fișierului încărcat, directorul în care fișierul este stocat temporar și tipul fișierului ales.

Să presupunem că un utilizator alege un fișier numit "myPics.zip".

  • $ _FILES ['fupload'] ['nume'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = un anumit director temporar de pe server.
  • $ _FILES ['fupload'] ['tip'] = "aplicație / zip". (Această valoare se poate modifica în funcție de browserul din care a fost încărcat fișierul.

Apoi, să explodez numele fișierului în două bucăți: numele și extensia.

 $ nume = explode ('.', $ filename); $ target = 'extras /'. $ nume [0]. "-". ora (). '/';

Continuând cu exemplul nostru "myPics.zip" fișierul - $ name [0] va fi egal cu "myPics". $ name [1] va fi egală cu "zip".

Apoi, vom crea o nouă variabilă numită "$ target". Aceasta va fi locația la care este salvat fișierul nostru. Pentru a ne asigura că un alt utilizator cu același nume "myPics" nu are suprascrise fișierele, trebuie să ne asigurăm că salvăm fișierele într-o locație unică. Pentru a îndeplini această sarcină, vom implementa funcția "time ()". Dacă adăugăm această valoare la numele fișierului încărcat, putem fi siguri că vom termina cu un nume de folder unic!

$ target = "extras / myPics-02151985 /"

Pasul 3: Asigurați-vă că a fost selectat un fișier zip

Imediat după variabila destinație $, lipiți următoarele:

 $ accept_types = array ("aplicație / zip", "aplicație / x-zip-comprimat", "multipart / x-zip", "aplicație / s-comprimat"); foreach ($ accept_types ca $ mime_type) dacă ($ mime_type == tip $) $ okay = true; pauză; 
  • Începem prin crearea unui matrice numit $ accepted_types. O căutare rapidă pe Google pentru "tipurile de zip mime" ne va aduce patru valori: 'application / zip', 'application / x-zip-compressed', 'multipart / x-zip', '. Fiecare browser are modul propriu de înregistrare a tipului de fișier. Trebuie să verificăm fiecare valoare în astfel de situații.
  • Pentru a face acest lucru, verificăm dacă vreunul dintre elementele din matricea noastră are aceeași valoare ca "$ _FILES ['fupload'] ['type']". În caz contrar, vom seta variabila "$ okay" la fel de egală cu "true" - și vom putea ieși din declarația "for" și vom fi siguri că utilizatorul a ales de fapt un fișier zip.

Din păcate, Safari și Chrome nu înregistrează un tip pentru fișiere zip. Acest lucru creează o problemă pentru noi. După un pic de cercetare, nu am reușit să găsesc o soluție ușoară - fără a utiliza o prelungire (PEAR). În schimb, vom asigura că numele fișierului se termină cel puțin în "zip". Trebuie remarcat faptul că acest lucru nu este 100% sigur. Ce se întâmplă dacă utilizatorul a încărcat un alt tip de fișier care sa încheiat cu "zip"? Nu ezitați să oferiți recomandări! :)

 $ okay = strtolower ($ nume [1]) == 'zip'? adevarat fals;
  • Vom folosi operatorul ternar pentru a păstra această declarație până la o linie. Dacă extensia numelui fișierului ($ name [1]) este egală cu 'zip', vom seta $ ok la true. În caz contrar, va fi egal cu "fals".

Apoi, vom verifica dacă $ bine este falsă. Dacă este cazul, știm că nu a fost selectat un dosar "zip". În astfel de cazuri, îi vom spune lui PHP să moară.

 dacă (! $ bine) mor ("Vă rugăm să alegeți un fișier zip, dummy!"); 

Pasul 4: Salvarea fișierului Zip

 mkdir ($ țintă); $ save_file_location = $ target. nume de fișier $; dacă move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  altceva die ("A fost o problemă, îmi pare rău!"); 
  • Mai întâi trebuie să creăm directorul pe care l-am referit cu variabila țintă $. Acest lucru se poate face cu ușurință utilizând funcția "mkdir".
  • Apoi, să încercăm să mutați fișierul încărcat, din directorul temporar, în directorul nostru $ target. Dacă procedura a fost efectuată cu succes, vom apela funcția "openZip".

Pasul 5: Funcția openZip ()

Creați o pagină nouă și salvați-o ca "functions.php". Acum adăugați următorul cod:

 deschis ($ file_to_open); dacă ($ x === adevărat) $ zip-> extractTo ($ target); $ Zip> close (); deconectez ($ file_to_open);  else die ("A apărut o problemă. Încercați din nou!"); ?>

Această funcție va accepta un parametru: $ file_to_open. Acest parametru va conține locația fișierului zip pe care încercăm să-l extragem!

  • Pentru a utiliza clasa ZipArchive (), trebuie mai întâi să vă asigurați că permiteți "php_zip.dll" în fișierul "php.ini". Pur și simplu căutați șirul respectiv și apoi eliminați punct și virgulă.
  • Cu orice clasă, trebuie să creați o nouă instanță a obiectului. Apoi vom apela metoda "open" și vom trece în locația fișierului care ar trebui să fie deschis. Dacă este efectuată cu succes, această metodă va reveni "adevărată". Dacă este cazul, vom extrage conținutul fișierului zip într-un dosar. Am creat deja calea către acest dosar când am creat variabila țintă $. (Notă - Pentru a accesa acea variabilă, trebuie să adăugați "global" în fața variabilei. Acest lucru va spune PHP să meargă în afara funcției curente și să caute variabila $ target.).
  • Odată ce fișierele au fost extrase, vom șterge fișierul zip - deoarece nu mai avem nevoie de el!

Amintiți-vă - am creat noul nostru fișier "functions.php", dar trebuie să îl includeți! Adăugați următoarele în partea de sus a paginii dvs. "index.php", imediat după eticheta PHP de deschidere.

 require_once 'functions.php';

Echoarea conținutului

Ceea ce până acum funcționează perfect! Dar, doar pentru a vă oferi feedback, hai să scanăm noul director și să reluăm conținutul. Ar trebui să ștergeți următorul bloc de cod din proiectul dvs. Este doar pentru testare. Dacă doriți să păstrați-o, ecou informațiile aflate în interiorul etichetei corporale.

 $ scan = scandir ($ țintă; $ nume [0]); imprimare '
    „; pentru ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], "html"); $ check_for_php = strpos ($ scan [$ i], "php"); dacă ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • ". $ scanare [$ i]. '
  • „; altceva echo '
  • ". $ scanare [$ i]. '
  • „; imprimare '
„;

Nu voi trece prea mult această ultimă parte - pentru că este inutil. Cu toate acestea, dacă doriți o explicație completă, asigurați-vă că vizionați ecranul asociat! Pentru a sinteti rapid, ultimul script scanează noul nostru director și emite o listă neordonată conținând conținutul.

Terminat

Nu prea tare, nu? Este o caracteristică elegantă care poate fi ușor implementată în proiectele dvs. Care sunt gândurile dvs. cu privire la securitate atunci când vine vorba de încărcarea fișierelor zip? Cum putem fi siguri că conținutul fișierului zip nu este dăunător? Mi-ar plăcea să aud opinia tuturor cu privire la aceste implicații în materie de securitate. Dacă nu este gestionat corect, un hacker ar putea provoca vătămări serioase serverului dvs. Să o discutăm! Este posibil să căutați tipuri de fișiere periculoase (fișiere .htaccess) și să le ștergeți.

Pagina finală Index.php

 „; pentru ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], "html"); $ check_for_php = strpos ($ scan [$ i], "php"); dacă ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • ". $ scanare [$ i]. '
  • „; altceva echo '
  • ". $ scanare [$ i]. '
  • „; imprimare '„; ?> Cum să încărcați și să deschideți fișiere zip cu PHP

    Încărcați un fișier zip


    • Abonați-vă la fluxul RSS NETTUTS pentru mai multe tutori și articole zilnice de dezvoltare web.


    Cod