Hur Zip och Unzip Files i CodeIgniter

Den första halvan av denna handledning förklarar olika sätt att skapa en zip-fil med inbyggda CodeIgniter API. Vi får se hur du skapar och sparar zip-filer på servern och hur du kan göra dem tillgängliga för nedladdning till slutanvändare också.

Den andra halvan innehåller en diskussion om hur du kan pakka ut filen. För att visa att vi bygger en anpassad sida som tillåter användare att ladda upp zip-filer som kommer att extraheras på servern efter framgångsrik filuppladdning. För att uppnå önskad funktionalitet kommer ZipArchive PHP förlängning till vår räddning!

Innan vi fortsätter och faktiskt dyker in i utvecklingsproblemen, listar jag de filer som vi ska utveckla under loppet av denna handledning:

  • application / controllers / Zip.php: Det är en kontrollerfil som visar olika sätt att skapa en zip-fil.
  • application / controllers / Unzip.php: Det är en kontrollerfil som innehåller koden som används för att pakka ut en användaruppladdad fil.
  • application / vyer / file_upload_form.php : Det är en visningsfil som innehåller ganska grundläggande HTML-filuppladdningskod.
  • application / vyer / file_upload_result.php: Det är en vyfil som visar resultatet av en användaruppladdad fil; I grund och botten berättar det om filen var framgångsrikt unzipped.
  • application / bibliotek / Extractor.php: Den här filen visar konceptet för ett anpassat bibliotek i CodeIgniter.

Med allt på plats är vi redo att gå vidare till nästa avsnitt!

Så här zip-filer?

Gå vidare och skapa en fil application / controllers / Zip.php med följande innehåll.

last> bibliotek ( 'zip');  privat funktion _archive_and_download ($ filnamn) // skapa zip-fil på servern $ this-> zip-> arkiv (FCPATH. '/ uploads /'.$ filnamn); // snabb användare att ladda ner zip-filen $ this-> zip-> download ($ filename);  offentliga funktionsdata () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ Detta -> _ archieve_and_download (my_info.zip ');  allmän funktion data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Webbutvecklare'); $ This-> zip-> add_data (filer $); $ Detta -> _ archieve_and_download (my_info.zip ');  allmän funktion data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ Detta -> _ archieve_and_download (my_info.zip ');  offentliga funktionsfiler () $ this -> _ load_zip_lib (); // passera andra argumentet som TRUE om vill behålla dir struktur $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ This-> zip-> read_file (FCPATH '/ uploads / 2.jpg'.); $ Detta -> _ archieve_and_download (images.zip ');  allmän funktion dir () $ this -> _ load_zip_lib (); // passera andra argumentet som FALSE om du vill ignorera föregående kataloger $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ Detta -> _ archieve_and_download (dir_images.zip '); 

Det är en ganska standard kontrollerfil som du redan är bekant med. Det har flera metoder, och var och en visar dig ett annat sätt att skapa en zip-fil.

Bortsett från det ger det två privata metoder, _load_zip_lib och _archieve_and_download, som kallas från resten av metoderna. Naturligtvis behöver du inte implementera dessa metoder, men vi har just refactored vår kod så att du inte slutar upprepa samma kod i andra metoder. Låt oss först gå igenom dessa två metoder.

Här är vad metoden _load_zip_lib ser ut som.

privat funktion _load_zip_lib () $ this-> load-> library ('zip'); 

Den laddar inbyggd zip-bibliotek i CodeIgniter-ramen så att du kan använda funktionerna i det biblioteket hela resten av koden. Nu kan du komma åt zip-biblioteket med $ This-> zip konvent.

Därefter finns det _archieve_and_download metod.

privat funktion _archive_and_download ($ filnamn) // skapa zip-fil på servern $ this-> zip-> arkiv (FCPATH. '/ uploads /'.$ filnamn); // snabb användare att ladda ner zip-filen $ this-> zip-> download ($ filename); 

När vi har laddat zip-biblioteket kan du använda de metoder som tillhandahålls av den. Arkivmetoden låter dig skapa en zip-fil på den väg som tillhandahålls som det första argumentet. Å andra sidan uppmanar hämtningsmetoden användaren för filhämtning.

Oroa dig inte om du undrar innehållet i vår zip-fil, så ser vi det på ett ögonblick.

Allt är på plats, så vi är redo att rulla!

Låt oss ta tag i koden för data metod. Den här metoden visar hur du skapar filer på flyg och lägger dem i en zip-fil.

offentliga funktionsdata () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ Detta -> _ archieve_and_download (my_info.zip '); 

Till att börja med har vi kallat _load_zip_lib metod som lastar zip-biblioteket. Därefter har vi använt add_data metod för zip-klassen som låter dig skapa en fil och fylla den med innehåll samtidigt! Naturligtvis läggs det till i arkivet också!

Det första argumentet ska vara namnet på filen, och det andra argumentet innehåller innehållet som går i filen.

Som du kan se har vi lagt till två filer, name.txt och profile.txt, med lite demoinnehåll. Slutligen kallar vi _archieve_and_download med my_info.zip som ett argument av den metoden. Vad gör det?

  • Det skapar en zip-fil my_info.zip under din uppladdningsmapp.
  • Det kommer också att uppmana en användare för filhämtning, och namnet med vilket filen kommer att sparas är my_info.zip.

Så se till att du har skapat en uppladdningar katalog i roten till din webbplats. Gör det också skrivbart av webbserverns användare. Nu, fortsätt och kör "http: // my-codeingiter-site / zip / data" för att se saker i åtgärd!

Om du har några problem kan du fråga mig i kommentarerna!

Därefter finns det data_array metod.

allmän funktion data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Webbutvecklare'); $ This-> zip-> add_data (filer $); $ Detta -> _ archieve_and_download (my_info.zip '); 

Denna metod är identisk med den för den sista som vi just har diskuterat, förutom att vi har lagt fram en rad filer till add_data metod istället för enskilda filer!

Låt oss ta tag i koden för data_with_subdirs metod.

allmän funktion data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ Detta -> _ archieve_and_download (my_info.zip '); 

Bara om du vill organisera dina filer inom vissa kataloger, så add_data Metoden låter dig skapa dem också. Den resulterande utmatningen av ovanstående metod kommer inte att vara annorlunda utom att name.txt och profile.txt filer kommer att placeras i info katalog.

Även om add_data Metoden ger en bra funktion som gör att du kan skapa filer på flugan, oftare behöver du inte zip befintliga filer på servern. Hur som helst, det är precis ämnet för våra nästa par metoder.

Låt oss snabbt titta på vad vår nästa filer Metoden ser ut. Det kommer att skapa en zip av filer under uppladdningar katalog.

offentliga funktionsfiler () $ this -> _ load_zip_lib (); // passera andra argumentet som TRUE om vill behålla dir struktur $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ This-> zip-> read_file (FCPATH '/ uploads / 2.jpg'.); $ Detta -> _ archieve_and_download (images.zip '); 

Syftet med read_file Metoden är att läsa den befintliga filen på servern och lägga till den i arkivet. Så som du kan se har vi lagt till de två filerna 1.jpg och 2.jpg till arkivet. Naturligtvis måste de två filerna vara närvarande under uppladdningar katalog i roten till din webbplats.

Om du passerar SANN som det andra argumentet från read_file Metoden, den resulterande zip-filen bevarar den exakta katalogstrukturen filen placerades i.

Prova att köra http: // my-codeingiter-site / zip / files och kolla resultatet!

Den sista metoden i det här segmentet är dir metod. Det skapar ett zip-arkiv av hela katalogen.

allmän funktion dir () $ this -> _ load_zip_lib (); // passera andra argumentet som FALSE om du vill ignorera föregående kataloger $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ Detta -> _ archieve_and_download (dir_images.zip '); 

Du kan använda read_dir metod om du vill skapa ett zip-arkiv av hela katalogen istället för vissa filer. I vårt exempel ovan kommer det att skapa en dir_images.zip fil som innehåller alla filer under / inlagda / bilder / katalog.

Det viktiga att notera här är att hela katalogstrukturen kommer att bevaras som standard i zip-filen. Men om du vill ignorera det, gå bara FALSK som det andra argumentet från read_dir metod. I så fall skapar det bara en bilder katalog i zip-filen.

Så det slutar vår historia om hur man skapar ett zip-arkiv med hjälp av olika metoder som tillhandahålls av den inbyggda zip-klassen.

Så här tar du ut zip-filer?

Tyvärr finns det inget inbyggt CodeIgniter-bibliotek som tillåter oss att pakka ut zip-arkivet. Men ZipArchive PHP-förlängningen gör det till en bris, som vi ser på ett ögonblick.

Vi kommer att skapa ett ganska enkelt exempel som visar hur du plockar upp användaruppladdade filer.

Gå vidare och skapa en fil application / controllers / Unzip.php med följande innehåll.

ladda-> hjälpar (array ('form', 'url'));  offentliga funktionsindex () $ this-> load-> view ('file_upload_form');  public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); om (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  annat $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; / **** utan bibliotek **** / $ zip = ny ZipArchive; om ($ zip-> öppna ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close ();  $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

Låt oss också skapa våra mallar för visning, så ser vi hur det fungerar helt och hållet.

Skapa en bildmallfil application / vyer / file_upload_form.php med följande innehåll.

    Välkommen till CodeIgniter    

Ladda upp fil

Det skapar en enkel fil uppladdning form så att användaren kan ladda upp zip-filen! Observera att jag har behållit det för enkelhetens skull.

Låt oss sedan skapa en bildmallfil application / vyer / file_upload_result.php.

    Välkommen till CodeIgniter    

Ladda upp filresultat

"><< Back to File Uploader

När filen är uppladdad och extraherad visas användaren ovanstående mall.

Nu, låt oss komma tillbaka till vår controller och gå igenom varje metod.

I konstruktören hos vår controller har vi laddat in det inbyggda form och url CodeIgniter helpers, så att vi kan använda hjälpfunktioner som form_open_multipart, SITE_URL och liknande.

Låt oss nu titta på index metod.

offentliga funktionsindex () $ this-> load-> view ('file_upload_form'); 

Behöver detta någon förklaring? Det kallar vyn file_upload_form och gör sidan. Så när du öppnar http: // my-codeingiter-site / unzip, ska det visa en enkel fil uppladdning form som visas nedan.

Observera också att handlingen i vår form är unzip / uppladdning där uppgifterna kommer att läggas ut. Vi har använt form_open_multipart hjälpen för att generera multipartformtaggen!

Därefter måste vi genomföra ladda upp åtgärdsmetod som hanterar filuppladdningen och utvinningspaketet. Ta tag i koden från den från Unzip.php kontrollant.

public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); om (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  annat $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ zip = ny ZipArchive; om ($ zip-> öppna ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close ();  $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

Om du är bekant med filuppladdning i CodeIgniter, så borde koden inte vara utländskt för dig. För dem som inte är bekanta, finns det inget att oroa sig för, eftersom de inbyggda uppladdnings API: erna i CodeIgniter gör det till en bris.

Följande kod laddar uppladdningsbiblioteket med någon initial konfiguration som tillhandahålls av $ config array variabeln.

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

Vi har konfigurerat det så att den uppladdade filen placeras under uppladdningar katalog i applikationsroten, och användaren får bara ladda upp zip-filer.

Därefter har vi kontrollerat om filuppladdningen har misslyckats, och om så är fallet hämtar vi ett användbart felmeddelande och tilldelar det $ params så att vi kan visa den i mallen.

$ params = array ('error' => $ this-> upload-> display_errors ());

I det fallet laddas filen upp framgångsrikt, så nästa steg är att få filbanan för den uppladdade filen.

$ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path'];

Slutligen instämmer vi ett ZipArchive-objekt, öppnar vår zip-fil och extraherar den till uppladdningar katalog.

$ zip = ny ZipArchive; om ($ zip-> öppna ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close (); 

Var inte så enkelt?

Det enda vi är kvar med är att ringa file_upload_result visa, och här är hur det ska se ut!

Så det är den andra delen av historien!

Refactor Unzipping Code till ett bibliotek

Du skulle ha märkt att ladda upp Metoden innehåller ZipArchive-koden som extraherar den uppladdade filen. Vad händer om du behöver använda den koden på flera ställen? Du kanske frestas att kopiera och klistra in koden efter behov.

Faktum är att det finns ett bättre sätt där CodeIgniter låter dig centralisera kod som kan användas i hela applikationen. Du kan skapa ett anpassat bibliotek.

Gå vidare och skapa en fil application / bibliotek / Extractor.php med följande innehåll.

CI = & get_instance (); $ this-> zip = new ZipArchive;  public function extrakt ($ source_file, $ dest_dir) if ($ this-> zip-> open ($ source_file) === TRUE) $ this-> zip-> extractTo ($ dest_dir); $ This-> zip-> close (); 

Nu, fortsätt och byt ut ladda upp metod i din Unzip.php kontroller med följande.

public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); om (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  annat $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ This-> last> bibliotek ( 'extraktor'); $ this-> extractor-> extrakt ($ full_path, FCPATH. '/ uploads /'); $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

Som du kan se har vi laddat vårt anpassade bibliotek och använt det för att extrahera innehållet!

$ This-> last> bibliotek ( 'extraktor'); $ this-> extractor-> extrakt ($ full_path, FCPATH. '/ uploads /');

Ganska coolt, va?

Och ja, det är slutet på den här artikeln.

Slutsats

Jag hoppas att du har haft den här artikeln, där vi började utforska kärn-zip-biblioteket i CodeIgniter-ramen och olika sätt att skapa ett zip-arkiv. I den andra delen förklarade jag hur du kan pakka upp användaruppladdade filer med hjälp av ZipArchive PHP-tillägget.

I processen fick vi också en chans att konvertera vår kod till Custom CodeIgniter-biblioteket, och det är något av en körsbär på toppen, skulle jag säga!

Låt mig veta om du kommer upp med några frågor och förslag som du kan skjuta med hjälp av flödet nedan.