Cum să zip și dezarhivați fișierele în CodeIgniter

Prima jumătate a acestui tutorial explică diferite moduri în care puteți crea un fișier zip folosind API-urile CodeIgniter încorporate. Vom vedea cum să creați și să salvați fișiere zip pe server și cum le puteți face disponibile și pentru utilizatorii finali.

A doua jumătate include o discuție despre cum puteți dezarhiva fișierul. Pentru a demonstra acest lucru, vom construi o pagină personalizată care permite utilizatorilor să încarce fișiere zip care vor fi extrase pe server după încărcarea de fișiere reușită. Pentru a atinge funcționalitatea dorită, extensia ZipArchive PHP vine în ajutorul nostru!

Înainte de a merge mai departe și de a se arunca de fapt în lucrurile de dezvoltare, voi lista fișierele pe care le vom dezvolta pe parcursul acestui tutorial:

  • aplicatii / controlori / Zip.php: Este un fișier de controler care demonstrează diferite moduri în care puteți crea un fișier zip.
  • aplicatii / controlori / Unzip.php: Este un fișier de controler care include codul utilizat pentru dezarhivarea unui fișier încărcat de utilizator.
  • cerere / vizualizari / file_upload_form.php : Acesta este un fișier de vizualizare care conține destul de bază de cod HTML formular de încărcare fișier.
  • cerere / vizualizari / file_upload_result.php: Este un fișier de vizualizare care afișează rezultatul unui fișier încărcat de utilizator; în principiu, vă spune dacă fișierul a fost dezarhis.
  • aplicatii / biblioteci / Extractor.php: Acest fișier demonstrează conceptul de bibliotecă personalizată în CodeIgniter.

Cu totul în loc, suntem gata să mergem la următoarea secțiune!

Cum se fac fișiere zip?

Continuați și creați un fișier aplicatii / controlori / Zip.php cu următorul conținut.

a sarcinii> bibliotecă ( 'zip');  funcția privată _archieve_and_download ($ filename) // crea fișier zip pe serverul $ this-> zip-> archive (FCPATH. '/ uploads /'.$ filename); // solicitați utilizatorului să descarce fișierul zip $ this-> zip-> download ($ filename);  funcții publice () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ("nume.txt", "Sajal Soni"); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ This -> _ archieve_and_download ( 'my_info.zip');  funcția publică data_array () $ this -> _ load_zip_lib (); $ files = array ('nume.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer'); $ This-> Zip> add_data ($ fișiere); $ This -> _ archieve_and_download ( 'my_info.zip');  funcția publică data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ("info / nume.txt", "Sajal Soni"); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ This -> _ archieve_and_download ( 'my_info.zip');  fișiere funcții publice () $ this -> _ load_zip_lib (); // treceți al doilea argument ca TRUE dacă doriți să păstrați structura dir $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ This-> Zip> read_file (FCPATH '/ upload / 2.jpg'.); $ This -> _ archieve_and_download ( 'images.zip');  funcția publică dir () $ this -> _ load_zip_lib (); // treceți al doilea argument ca FALSE dacă doriți să ignorați directoarele precedente $ this-> zip-> read_dir (FCPATH. / uploads / images / '); $ This -> _ archieve_and_download ( 'dir_images.zip'); 

Este un dosar destul de standard al controlorului cu care sunteți deja familiarizat. Acesta conține mai multe metode și fiecare dintre ele vă arată o altă modalitate de a crea un fișier zip.

În afară de aceasta, oferă două metode private, _load_zip_lib și _archieve_and_download, care sunt chemați din restul metodelor. Desigur, nu este nevoie să implementați aceste metode, dar tocmai ne-am refacturat codul, astfel încât să nu terminați repetarea aceluiași cod în alte metode. Să mergem mai întâi prin aceste două metode.

Iată ce înseamnă metoda _load_zip_lib se pare ca.

funcția privată _load_zip_lib () $ this-> load-> library ('zip'); 

Încarcă biblioteca zip integrată a cadrului CodeIgniter, astfel încât să puteți utiliza caracteristicile acelei biblioteci pe tot restul codului. Acum, puteți accesa biblioteca zip cu $ This-> zip convenţie.

Mai departe, există _archieve_and_download metodă.

funcția privată _archieve_and_download ($ filename) // crea fișier zip pe serverul $ this-> zip-> archive (FCPATH ./ uploads /'.$ filename); // solicitați utilizatorului să descarce fișierul zip $ this-> zip-> download ($ filename); 

După ce am încărcat biblioteca zip, puteți utiliza metodele furnizate de aceasta. Metoda de arhivare vă permite să creați un fișier zip în calea furnizată ca primul argument. Pe de altă parte, metoda de descărcare solicită utilizatorului descărcarea fișierului.

Nu vă faceți griji dacă vă întrebați conținutul fișierului zip, așa cum o vom vedea într-o clipă.

Totul este la locul lui, așa că suntem gata să ne întoarcem!

Să luăm codul date metodă. Această metodă vă arată cum să creați fișiere în zbor și să le înfășurați într-un fișier zip.

funcțiile publice () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ("nume.txt", "Sajal Soni"); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ This -> _ archieve_and_download ( 'my_info.zip'); 

În primul rând, am sunat _load_zip_lib metodă care încarcă biblioteca zip. Apoi, am folosit add_data metoda din clasa zip care vă permite să creați un fișier și să-l umpleți cu conținut în același timp! Desigur, se adaugă și la arhivă!

Primul argument ar trebui să fie numele fișierului, iar cel de-al doilea argument conține conținutul care merge în fișier.

După cum puteți vedea, am adăugat două fișiere, name.txt și profile.txt, cu unele conținuturi demo. În cele din urmă, sunăm _archieve_and_download cu my_info.zip ca argument al acestei metode. Ce face?

  • Va crea un fișier zip my_info.zip sub directorul de încărcări.
  • De asemenea, va solicita un utilizator pentru descărcare de fișiere, iar numele cu care fișierul va fi salvat este my_info.zip.

Deci, asigurați-vă că ați creat un încărcări director la radacina site-ului dvs. De asemenea, faceți-o scriitoare de către utilizatorul serverului web. Acum, mergeți mai departe și rulați "http: // my-codeingiter-site / zip / data" pentru a vedea lucrurile în acțiune!

Dacă aveți probleme, puteți să mă întrebați în comentarii!

Mai departe, există data_array metodă.

funcția publică data_array () $ this -> _ load_zip_lib (); $ files = array ('nume.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer'); $ This-> Zip> add_data ($ fișiere); $ This -> _ archieve_and_download ( 'my_info.zip'); 

Această metodă este identică cu cea din ultima pe care tocmai am discutat-o, cu excepția faptului că am oferit o serie de fișiere către add_data în loc de fișiere individuale!

Apoi, hai să luăm codul data_with_subdirs metodă.

funcția publică data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ("info / nume.txt", "Sajal Soni"); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ This -> _ archieve_and_download ( 'my_info.zip'); 

Doar în cazul în care doriți să vă organizați fișierele în anumite directoare, add_data vă permite să le creați, de asemenea. Rezultatul rezultat al metodei de mai sus nu va fi diferit, cu excepția faptului că name.txt și profile.txt fișierele vor fi plasate în info director.

desi add_data metoda oferă o caracteristică plăcută care vă permite să creați fișiere în zbor, mai des decât va trebui să zip fișiere existente pe server. Oricum, acesta este exact subiectul următoarelor noastre metode.

Să ne uităm repede la ceea ce urmează fișiere metoda arata ca. Acesta va crea un zip de fișiere sub încărcări director.

fișiere de funcții publice () $ this -> _ load_zip_lib (); // treceți al doilea argument ca TRUE dacă doriți să păstrați structura dir $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ This-> Zip> read_file (FCPATH '/ upload / 2.jpg'.); $ This -> _ archieve_and_download ( 'images.zip'); 

Scopul read_file este să citiți fișierul existent de pe server și să îl adăugați la arhivă. După cum puteți vedea, am adăugat cele două fișiere 1.jpg și 2.jpg la arhiva. Desigur, aceste două fișiere trebuie să fie prezente sub încărcări director la radacina site-ului dvs..

Dacă treceți ADEVĂRAT ca al doilea argument al read_file , fișierul zip rezultat păstrează structura exactă a directorului în care a fost plasat fișierul.

Încercați să rulați http: // my-codeingiter-site / zip / files și verificați rezultatul!

Ultima metodă din acest segment este dir metodă. Va crea o arhivă zip a întregului director.

funcția publică dir () $ this -> _ load_zip_lib (); // treceți al doilea argument ca FALSE dacă doriți să ignorați directoarele precedente $ this-> zip-> read_dir (FCPATH. / uploads / images / '); $ This -> _ archieve_and_download ( 'dir_images.zip'); 

Puteți utiliza funcția read_dir dacă doriți să creați o arhivă zip a întregului director în loc de anumite fișiere. În exemplul nostru de mai sus, va crea o dir_images.zip fișierul care conține toate fișierele din / uploads / images / director.

Cel mai important lucru pe care trebuie să-l rețineți este că întreaga structură de directoare va fi păstrată în mod implicit în fișierul zip. Dar, dacă vreți să o ignorați, trebuie doar să treceți FALS ca al doilea argument al read_dir metodă. În acest caz, va crea doar un imagini director în fișierul zip.

Așa că se încheie povestea noastră despre cum să creați o arhivă zip utilizând diferite metode furnizate de clasa zip încorporată.

Cum se dezarhivează fișierele?

Din păcate, nu există o bibliotecă codificată built-in care să ne permită dezarhivarea arhivei zip. Dar extensia ZipArchive PHP o face o briza, așa cum vom vedea într-un moment.

Vom crea un exemplu destul de simplu, care demonstrează modul de dezarhivare a fișierelor încărcate de utilizatori.

Continuați și creați un fișier aplicatii / controlori / Unzip.php cu următorul conținut.

load-> helper (array ('form', 'url'));  indexul funcției publice () $ this-> load-> view ('file_upload_form');  funcția publică de încărcare () $ config ['upload_path'] = './uploads/'; $ config ['permis_types'] = 'zip'; $ this-> load-> library ("upload", $ config); dacă ! $ this-> upload-> do_upload ('zip_file')) $ params = array ('eroare' => $ this-> upload-> display_errors ());  altceva $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ date ['upload_data'] ['cale_path']; / **** fără bibliotecă **** / $ zip = nou ZipArhive; dacă ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close ();  $ params = array ('succes' => 'Extras cu succes!');  $ this-> load-> view ('file_upload_result', $ params); 

Să formăm, de asemenea, șabloanele noastre de vizualizare și apoi vom vedea cum funcționează complet.

Creați un fișier de șablon de vizualizare cerere / vizualizari / file_upload_form.php cu următorul conținut.

    Bun venit la CodeIgniter    

Incarca fisier

Creează un formular simplu de încărcare a fișierului, astfel încât utilizatorul să poată încărca fișierul zip! Rețineți că am păstrat-o la un nivel minim din motive de simplitate.

Apoi, să creăm un fișier de șablon de vizualizare cerere / vizualizari / file_upload_result.php.

    Bun venit la CodeIgniter    

Încărcați rezultatul fișierului

„><< Back to File Uploader

După încărcarea și extragerea fișierului, utilizatorul va afișa șablonul de mai sus.

Acum, să ne întoarcem la controlorul nostru și să trecem prin fiecare metodă.

În constructorul controlorului nostru, am încărcat built-in-ul formă și URL-ul Ajutoarele CodeIgniter, astfel încât să putem folosi funcții de ajutor cum ar fi form_open_multipart, Adresa paginii și altele asemenea.

Apoi, să aruncăm o privire la index metodă.

indexul funcției publice () $ this-> load-> view ('file_upload_form'); 

Are nevoie de explicații? Se numește vederea file_upload_form și redă pagina. Deci, când accesați http: // my-codeingiter-site / unzip, ar trebui să afișeze un formular simplu de încărcare a fișierului, după cum se arată mai jos.

De asemenea, rețineți că acțiunea din formularul nostru este unzip / încărcare unde datele vor fi postate. Am folosit-o form_open_multipart helper pentru a genera eticheta formular multipart!

Apoi, trebuie să implementăm încărcați metoda de acțiune care se va ocupa de încărcarea și extragerea fișierelor. Prinde codul de la Unzip.php controlor.

funcția de încărcare publică () $ config ['upload_path'] = './uploads/'; $ config ['permis_types'] = 'zip'; $ this-> load-> library ("upload", $ config); dacă ! $ this-> upload-> do_upload ('zip_file')) $ params = array ('eroare' => $ this-> upload-> display_errors ());  altceva $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ date ['upload_data'] ['cale_path']; $ zip = nouArticol Zip; dacă ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close ();  $ params = array ('succes' => 'Extras cu succes!');  $ this-> load-> view ('file_upload_result', $ params); 

Dacă sunteți familiarizat cu încărcarea fișierelor în CodeIgniter, codul nu ar trebui să arate străin pentru dvs. Pentru cei care nu sunt familiarizați, nu este nimic de ce să vă faceți griji, deoarece API-urile de încărcare încorporate în CodeIgniter fac o briză.

Următorul cod încarcă biblioteca de încărcare cu o configurație inițială furnizată de $ config matrice variabilă.

$ this-> load-> library ("upload", $ config);

Am configurat-o astfel încât fișierul încărcat să fie plasat sub încărcări director de la baza aplicației, iar utilizatorului i se va permite să încarce numai fișiere zip.

Apoi, am verificat dacă încărcarea fișierului a eșuat și, dacă este cazul, vom prelua un mesaj de eroare util și îl vom atribui $ params astfel încât să îl putem afișa în șablon.

$ params = array ("eroare" => $ this-> upload-> display_errors ());

În acest caz, fișierul este încărcat cu succes, deci următorul pas este să obțineți calea fișierului fișierului încărcat.

$ data = array ('upload_data' => $ acest-> încărcare-> date ()); $ full_path = $ date ['upload_data'] ['cale_path'];

În cele din urmă, instanțiăm un obiect ZipArchive, deschideți fișierul zip și extrageți-l la încărcări director.

$ zip = nouArticol Zip; dacă ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close (); 

Nu a fost atât de simplu?

Singurul lucru pe care l-am lăsat este să-l sunăm file_upload_result vizualizați și arătați cum ar trebui să arate!

Deci, asta e cealaltă parte a povestirii!

Refactor Codul de dezarhivare la o bibliotecă

Ați fi observat că încărcați metoda conține codul ZipArchive care extrage fișierul încărcat. Ce se întâmplă dacă trebuie să utilizați acest cod în mai multe locuri? S-ar putea să fiți tentat să copiați și să inserați codul după cum este necesar.

Într-adevăr, există o modalitate mai bună în care CodeIgniter vă permite să centralizați codul care poate fi utilizat în întreaga aplicație. Ați putea crea o bibliotecă personalizată.

Continuați și creați un fișier aplicatii / biblioteci / Extractor.php cu următorul conținut.

CI = & get_instance (); $ this-> zip = arhiva Zip nou;  extract de funcții publice ($ source_file, $ dest_dir) if ($ this-> zip-> open ($ source_file) === TRUE) $ this-> zip-> extractTo ($ dest_dir); $ This-> Zip> close (); 

Acum, mergeți mai departe și înlocuiți-l încărcați metoda în dvs. Unzip.php controler cu următorul.

funcția de încărcare publică () $ config ['upload_path'] = './uploads/'; $ config ['permis_types'] = 'zip'; $ this-> load-> library ("upload", $ config); dacă ! $ this-> upload-> do_upload ('zip_file')) $ params = array ('eroare' => $ this-> upload-> display_errors ());  altceva $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ date ['upload_data'] ['cale_path']; $ This-> a sarcinii> biblioteca ( 'extractor'); $ this-> extractor-> extras ($ full_path, FCPATH. '/ uploads /'); $ params = array ('succes' => 'Extras cu succes!');  $ this-> load-> view ('file_upload_result', $ params); 

După cum puteți vedea, ne-am încărcat biblioteca personalizată și am folosit-o pentru a extrage conținutul!

$ This-> a sarcinii> biblioteca ( 'extractor'); $ this-> extractor-> extras ($ full_path, FCPATH. '/ uploads /');

Destul de cool, huh?

Și da, acesta este sfârșitul acestui articol.

Concluzie

Sper că v-ați bucurat de acest articol, în care am început să explorăm biblioteca zip core din cadrul CodeIgniter și diferite moduri în care puteți crea o arhivă zip. În a doua parte, i-am explicat cum puteți dezarhiva fișierele încărcate de utilizatori utilizând extensia PHP ZipArchive.

În acest proces, avem de asemenea șansa de a converti codul nostru în biblioteca personalizată CodeIgniter, și asta e ceva de o cireșă în partea de sus, aș spune!

Dați-mi voie să știu dacă v-ați confruntat cu orice întrebări și sugestii pe care le puteți trage folosind feed-ul de mai jos.

Cod