Cum să zip și dezarhivați fișiere în PHP

Comprimarea fișierelor atunci când le transferați pe internet are multe avantaje. În majoritatea cazurilor, dimensiunea totală combinată a tuturor fișierelor în format comprimat scade cu o marjă foarte bună. Acest lucru înseamnă că veți economisi o parte din lățimea de bandă, iar utilizatorii vor obține și viteze de descărcare mai rapide. Odată ce utilizatorii au descărcat un fișier, îl pot decomprima ori de câte ori doresc. Pe scurt, compresia poate face ca fișierele de difuzare pe internet să fie mult mai ușor pentru dvs., precum și pentru vizitatorii dvs..

Un factor care vă poate descuraja să comprimați fișierele sau să faceți acest proces foarte obositor este faptul că ați putea să o faceți manual. Din fericire, PHP vine cu o mulțime de extensii care se ocupă în special de compresia și extragerea fișierelor. Puteți utiliza funcțiile disponibile în aceste extensii pentru a comprima automat fișiere în PHP.

Acest tutorial vă va învăța cum să zip și dezarhivați (comprimați și extrageți) fișiere în și de la o arhivă zip în PHP. De asemenea, veți afla cum să ștergeți sau să redenumiți fișiere într-o arhivă, fără a le extrage mai întâi.

Comprimarea fișierelor în PHP

PHP ZipArchive clasa are o mulțime de proprietăți și metode care vă pot ajuta să comprimați și să decomprimați toate fișierele.

Comprimați fișierele individuale

Puteți adăuga fișiere în arhiva zip unul câte unul sau puteți adăuga întregul director simultan. În ambele cazuri, primul pas este crearea unui nou ZipArchive instanță și apoi a apela deschideți (numele fișierului $, [$ flags]) metodă. Această metodă va deschide o nouă arhivă zip pentru citire, scriere sau alte modificări. Există patru valori valide pentru opțional $ pavilion care determină modul de gestionare a diferitelor situații.

  • ZipArchive :: OVERWRITE-Acest steguleț va suprascrie conținutul din arhiva specificată dacă există deja.
  • ZipArchive :: CREEAZĂ-Acest steguleț va crea o nouă arhivă dacă nu există deja.
  • ZipArchive :: Excl-Acest steag va duce la o eroare dacă arhiva există deja.
  • ZipArchive :: CHECKCONS-Acest pavilion va spune ca PHP să efectueze verificări suplimentare de consistență asupra arhivei și să dea o eroare în cazul în care nu reușesc.

Puteți verifica documentația acestei metode pentru a afla despre diferitele coduri de eroare returnate în caz de nereușite a fișierului. Dacă fișierul zip a fost deschis sau creat cu succes, metoda va reveni Adevărat.

Odată ce ați deschis arhiva cu succes, puteți utiliza addFile (numele fișierului $, $ localname, $ start, $ length) pentru a adăuga orice fișier de pe o cale dată în arhivă. $ filename parametru este calea unui fișier pe care doriți să îl adăugați la arhivă. $ LocalName parametru este folosit pentru a atribui un nume fișierului pentru ao stoca în interiorul arhivei. Poti suna adauga fisier() de fiecare dată când doriți să adăugați un nou fișier în arhivă.

După adăugarea tuturor fișierelor necesare în arhivă, puteți apela pur și simplu închide() metodă de închidere și de salvare a modificărilor.

Să presupunem că aveți un site web care permite utilizatorilor să descarce fișiere de fonturi pentru diferite fonturi, împreună cu informațiile de licențiere pentru a le utiliza. Fișierele ca acestea vor fi exemple perfecte de arhivare automată folosind PHP. Următorul cod vă arată cum să faceți exact acest lucru.

deschide ('compressed / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('Fonturi / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('fonturi / Monoton / OFL.txt', 'license.txt'); $ Zip> close (); ?>

Începem prin crearea unui ZipArchive instanță și apoi folosind deschis() pentru a crea arhiva noastră. adauga fisier() metoda adaugă realitatea noastră .ttf fișierul de fișiere și .txt fișier de licență în arhivă.

Trebuie să rețineți că fișierele originale se aflau în interiorul fonturi / monoton director. Cu toate acestea, codul PHP îl plasează direct în rădăcina arhivei noastre. Puteți modifica structura directorului, precum și numele fișierelor care intră în arhivă.

Comprimarea mai multor fișiere dintr-un director

Adăugarea de fișiere individuale în arhiva dvs. poate deveni obositoare după un timp. De exemplu, ați putea dori să creați o arhivă a tuturor .pdf sau .png fișiere într-un director. addGlob ($ pattern, $ flags, $ options) metoda se va dovedi foarte utilă în acest caz. Singurul dezavantaj al acestei metode este că pierdeți controlul asupra locației fișierelor individuale din arhivă. Cu toate acestea, puteți influența în continuare structura directoarelor din arhivă utilizând opţiuni de $ parametru. Opțiunile sunt transmise sub forma unei matrice asociative.

  • add_path-Valoarea pe care o alocați add_path este prefixată la calea locală a fișierului din arhivă.
  • remove_path-Valoarea pe care o alocați remove_path este utilizat pentru a elimina un prefix corespunzător din calea diferitelor fișiere adăugate în arhivă.
  • remove_all_path-Setarea valorii remove_all_path la Adevărat va elimina totul din calea fișierului în afară de numele său. În acest caz, fișierele sunt adăugate la rădăcina arhivei.

Este important să rețineți că îndepărtarea unei căi se face înainte de a prefixa valoarea specificată în add_path.

Următorul fragment de cod va face uz de addGlob () și toate aceste opțiuni mai clare.

$ zip = nou ZipArhive (); $ zip-> deschide ('compressed / user_archive.zip', ZipArchive :: CREATE); $ opțiuni = array ('add_path' => 'light_wallpapers /', 'remove_all_path' => TRUE); $ zip-> addGlob ('luminile / *. jpg', 0, $ opțiuni); $ opțiuni = array ('add_path' => 'font_files /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documente / * .ttf', 0, $ opțiuni); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documente / * .pdf', 0, $ opțiuni); $ options = array ('add_path' => 'imagini /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documente / *. jpg, png', GLOB_BRACE, $ opțiuni); $ Zip> close ();

Ca de obicei, începem prin crearea unui ZipArchive instanță și apoi utilizați deschis() pentru a crea arhiva noastră. De asemenea, specificăm diferite valori pentru add_path tastați în opţiuni de $ array de fiecare dată înainte de a apela addGlob () metodă. În acest fel, putem face față unui set specific de fișiere la un moment dat și oferim opțiuni de arhivare în consecință.

În primul caz, vom itera peste tot .jpg fișiere în lumini și plasați - le în light_wallpapers director în arhivă. În mod similar, iteram peste toate .ttf fișiere în documente director și apoi le puneți în interiorul unui dosar numit font_files în arhiva noastră. În cele din urmă, vom itera peste toate .jpg și .png fișierele din documentele noastre deodată și le puneți împreună în imagini director.

După cum puteți vedea, valorile din opţiuni de $ sunt utile în organizarea conținutului din arhivă.

Extragerea conținutului dintr-o arhivă

ZipArchive clasa are o metodă numită extractTo ($ destinație, $ intrări) pentru a extrage conținutul unei arhive. Puteți să-l utilizați fie pentru a extrage tot ce se află în arhivă, fie doar pentru anumite fișiere specifice. intrări $ parametrul poate fi folosit pentru a specifica un singur nume de fișier care urmează să fie extras sau îl puteți utiliza pentru a transmite o serie de fișiere.

Un punct important de reținut este că trebuie să specificați calea corectă a fișierului din interiorul arhivei pentru ao extrage. De exemplu, am arhivat un fișier de fonturi numit AlegreyaSans-Light.ttf în secțiunea anterioară. Fișierul a fost stocat în arhivă într-un director numit font_files. Aceasta înseamnă că calea pe care trebuie să o specificați în intrări $ parametru ar fi font_files / AlegreyaSans-Light.ttf și nu pur și simplu AlegreyaSans-Light.ttf.

Structura directorului și a fișierelor va fi păstrată în timpul procesului de extragere, iar fișierele vor fi extrase în directoarele respective.

deschide ('compressed / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('necomprimat /', 'font_files / AlegreyaSans-Light.ttf'); $ Zip> close (); ?>

Dacă omiteți al doilea parametru, metoda va extrage toate fișierele din arhivă.

Obțineți mai mult control asupra arhivelor

ZipArchive clasa are, de asemenea, o mulțime de alte metode și proprietăți pentru a vă ajuta să obțineți mai multe informații despre arhivă înainte de extragerea întregului său conținut.

Puteți număra numărul de fișiere dintr-o arhivă utilizând numara() metodă. O altă opțiune este utilizarea funcției numFiles proprietate. Ele pot fi utilizate pentru a repeta toate fișierele din arhivă și extrage doar cele care aveți nevoie - sau puteți să faceți altceva cu ele, cum ar fi eliminarea acestora din arhivă.

În următorul exemplu, ștergem toate fișierele din arhivă care conțin cuvântul Cursiv. Codul similar ar putea fi utilizat pentru a șterge toate fișierele care nu conțin un anumit cuvânt. Puteți, de asemenea, să repetați aceste fișiere și să înlocuiți un anumit cuvânt cu altceva.

deschide ('compressed / user_archive.zip', ZipArchive :: CREATE); $ fișier_count = $ zip-> număr (); pentru ($ i = 0; $ i < $file_count; $i++)  $file_name = $zip->getNameIndex ($ i); dacă (stripos ($ file_name, 'Italic')! == false) $ zip-> deleteName ($ file_name);  zip-> close (); ?>

În codul de mai sus, folosim deleteName () pentru a șterge un fișier individual. Cu toate acestea, îl puteți utiliza și pentru a șterge un întreg director.

O funcție similară renameName ($ oldname, $ newname) poate fi folosit pentru a schimba numele oricărui fișier din arhivă. Veți primi o eroare dacă un fișier este intitulat $ NewName deja exista.

Gândurile finale

Am acoperit o grămadă de metode foarte utile ZipArchive clasa care va face compresia automată și extragerea fișierelor în PHP o briză. Acum ar trebui să puteți comprima fișiere individuale sau un grup dintr-o dată, pe baza propriilor criterii. În mod similar, ar trebui să puteți extrage orice fișier din arhivă fără a afecta alt conținut.

Cu ajutorul numara() și numFiles, veți obține mai mult control asupra fișierelor individuale și redenumirea sau ștergerea acestora ar fi foarte ușoară. Trebuie să treceți prin documentație cel puțin o dată pentru a citi despre mai multe astfel de funcții.

Cod