Slik Zip og pakke ut filer i CodeIgniter

Første halvdel av denne opplæringen forklarer forskjellige måter du kan lage en zip-fil ved hjelp av innebygde CodeIgniter APIer. Vi ser hvordan du lager og lagrer zip-filer på serveren og hvordan du kan gjøre dem tilgjengelige for nedlasting til sluttbrukere også.

Den andre halvdelen inneholder en diskusjon om hvordan du kan pakke ut filen. For å demonstrere det, vil vi bygge en egendefinert side som lar brukere laste opp zip-filer som vil bli hentet ut på serveren etter vellykket filopplasting. For å oppnå ønsket funksjonalitet kommer ZipArchive PHP-utvidelsen til vår redning!

Før vi går videre og faktisk dykker inn i utviklingsspillene, vil jeg liste opp filene som vi skal utvikle i løpet av denne opplæringen:

  • application / kontrollere / Zip.php: Det er en kontrollerfil som demonstrerer ulike måter du kan lage en zip-fil på.
  • application / kontrollere / Unzip.php: Det er en kontrollerfil som inneholder koden som brukes til å pakke ut en brukeropplastet fil.
  • application / visninger / file_upload_form.php : Det er en visningsfil som inneholder ganske grunnleggende HTML-filopplastingsskjema.
  • application / visninger / file_upload_result.php: Det er en visningsfil som viser resultatet av en brukeropplastet fil; I utgangspunktet forteller det deg om filen ble slettet.
  • application / bibliotek / Extractor.php: Denne filen demonstrerer konseptet med et tilpasset bibliotek i CodeIgniter.

Med alt på plass, er vi klare til å gå videre til neste del!

Slik Zip-filer?

Gå videre og lag en fil application / kontrollere / Zip.php med følgende innhold.

last> bibliotek ( 'zip');  privat funksjon _archive_and_download ($ filnavn) // lage zip-fil på server $ this-> zip-> arkiv (FCPATH. '/ uploads /'.$ filnavn); // rask bruker å laste ned zip-filen $ this-> zip-> download ($ filnavn);  offentlige funksjonsdata () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'webutvikler'); $ Dette -> _ archieve_and_download ( 'my_info.zip');  offentlig funksjon data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Webutvikler'); $ Dette-> zip> add_data ($ filer); $ Dette -> _ archieve_and_download ( 'my_info.zip');  offentlig funksjon data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'webutvikler'); $ Dette -> _ archieve_and_download ( 'my_info.zip');  offentlige funksjonsfiler () $ this -> _ load_zip_lib (); // passere andre argument som SANT hvis du vil bevare dir strukturen $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ Dette-> glidelåsen> read_file (FCPATH '/ opplasting / 2.jpg'.); $ Dette -> _ archieve_and_download ( 'images.zip');  offentlig funksjon dir () $ this -> _ load_zip_lib (); // passere andre argument som FALSE hvis du vil ignorere tidligere kataloger $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ Dette -> _ archieve_and_download ( 'dir_images.zip'); 

Det er en ganske standard kontrollerfil som du allerede er kjent med. Den har flere metoder, og hver av dem viser deg en annen måte å lage en zip-fil på.

Bortsett fra det, gir det to private metoder, _load_zip_lib og _archieve_and_download, som kalles fra resten av metodene. Selvfølgelig trenger du ikke å implementere disse metodene, men vi har nettopp refactored vår kode slik at du ikke ender opp med å gjenta samme kode i andre metoder. La oss først gå gjennom disse to metodene.

Her er hva metoden _load_zip_lib ser ut som.

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

Den laster inn det innebygde zip-biblioteket i CodeIgniter-rammen, slik at du kan bruke funksjonene i biblioteket over hele resten av koden. Nå kan du få tilgang til zip-biblioteket med $ Dette-> zip konvensjon.

Deretter er det _archieve_and_download metode.

privat funksjon _archive_and_download ($ filnavn) // lage zip-fil på server $ this-> zip-> arkiv (FCPATH. '/ uploads /'.$ filnavn); // rask bruker å laste ned zip-filen $ this-> zip-> download ($ filnavn); 

Som vi har lastet inn zip-biblioteket, kan du bruke metodene som tilbys av det. Arkivmetoden lar deg lage en zip-fil på banen som er gitt som det første argumentet. På den annen side spør nedlastingsmetoden brukeren for filnedlasting.

Ikke bekymre deg hvis du lurer på innholdet i zip-filen, som vi ser det i et øyeblikk.

Alt er på plass, så vi er klare til å rulle!

La oss ta tak i koden til data metode. Denne metoden viser hvordan du lager filer på fly og pakk dem i en zip-fil.

offentlige funksjonsdata () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'webutvikler'); $ Dette -> _ archieve_and_download ( 'my_info.zip'); 

Til å begynne med har vi kalt _load_zip_lib Metode som laster zip-biblioteket. Deretter har vi brukt add_data Metode for zip-klassen som lar deg lage en fil og fylle den med innhold samtidig! Selvfølgelig er det lagt til arkivet også!

Det første argumentet skal være navnet på filen, og det andre argumentet inneholder innholdet som går i filen.

Som du kan se, har vi lagt til to filer, name.txt og profile.txt, med noen demo innhold. Til slutt, vi ringer _archieve_and_download med my_info.zip som et argument av den metoden. Hva gjør den?

  • Det vil opprette en zip-fil my_info.zip under laste opp katalogen din.
  • Det vil også be om en bruker for filnedlasting, og navnet som filen vil bli lagret på er my_info.zip.

Så sørg for at du har opprettet en opplastinger katalog på roten til nettstedet ditt. Også, gjør det skrivbar av brukeren av webserveren. Nå, fortsett og kjør "http: // my-codeingiter-site / zip / data" for å se ting i aksjon!

Hvis du har noen problemer, kan du spørre meg i kommentarene!

Deretter er det data_array metode.

offentlig funksjon data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Webutvikler'); $ Dette-> zip> add_data ($ filer); $ Dette -> _ archieve_and_download ( 'my_info.zip'); 

Denne metoden er identisk med den sistnevnte som vi nettopp har diskutert, bortsett fra at vi har gitt en rekke filer til add_data metode i stedet for individuelle filer!

Neste, la oss ta tak i koden til data_with_subdirs metode.

offentlig funksjon data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'webutvikler'); $ Dette -> _ archieve_and_download ( 'my_info.zip'); 

Bare hvis du vil organisere filene dine i bestemte kataloger, vil add_data Metoden lar deg lage dem også. Den resulterende produksjonen av fremgangsmåten ovenfor vil ikke være annerledes, bortsett fra at name.txt og profile.txt filer vil bli plassert i info katalog.

Selv om add_data Metoden gir en fin funksjon som gjør at du kan lage filer på farten, oftere enn ikke, du må zip eksisterende filer på serveren. Uansett, det er akkurat emnet for våre neste par metoder.

La oss raskt se på hva vår neste filer Metoden ser ut som. Det vil opprette en zip av filer under opplastinger katalog.

offentlige funksjonsfiler () $ this -> _ load_zip_lib (); // passere andre argument som SANT hvis du vil bevare dir strukturen $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ Dette-> glidelåsen> read_file (FCPATH '/ opplasting / 2.jpg'.); $ Dette -> _ archieve_and_download ( 'images.zip'); 

Formålet med read_file Metode er å lese den eksisterende filen på serveren og legge den til i arkivet. Så som du kan se, har vi lagt til de to filene 1.jpg og 2.jpg til arkivet. Selvfølgelig må disse to filene være til stede under opplastinger katalog på roten til nettstedet ditt.

Hvis du passerer EKTE som det andre argumentet til read_file Metoden, den resulterende zip-filen bevarer den nøyaktige katalogstrukturen filen ble plassert i.

Prøv å kjøre http: // my-codeingiter-site / zip / files og sjekke resultatet!

Den siste metoden i dette segmentet er dir metode. Det vil opprette et zip-arkiv av hele katalogen.

offentlig funksjon dir () $ this -> _ load_zip_lib (); // passere andre argument som FALSE hvis du vil ignorere tidligere kataloger $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ Dette -> _ archieve_and_download ( 'dir_images.zip'); 

Du kan bruke read_dir metode hvis du vil opprette et zip-arkiv av hele katalogen i stedet for bestemte filer. I vårt eksempel ovenfor vil det opprette en dir_images.zip fil som inneholder alle filene under / opplastninger / images / katalog.

Det viktige å merke seg her er at hele katalogstrukturen vil bli beholdt som standard i zip-filen. Men hvis du vil ignorere det, bare pass FALSK som det andre argumentet til read_dir metode. I så fall vil det bare opprette en Bilder katalog i zip-filen.

Så slutter vår historie om hvordan du oppretter et zip-arkiv ved hjelp av ulike metoder som tilbys av den innebygde zip-klassen.

Hvordan pakke ut filer?

Dessverre er det ikke et innebygd CodeIgniter-bibliotek som lar oss pakke ut ziparkivet. Men ZipArchive PHP-utvidelsen gjør det til en bris, som vi ser om et øyeblikk.

Vi lager et ganske enkelt eksempel som demonstrerer hvordan du pakker opp brukeropplastede filer.

Gå videre og lag en fil application / kontrollere / Unzip.php med følgende innhold.

last-> hjelper (array ('form', 'url'));  offentlige funksjonsindeks () $ this-> load-> view ('file_upload_form');  offentlig funksjon opplasting () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); hvis (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  ellers $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; / **** uten bibliotek **** / $ zip = ny ZipArchive; hvis ($ zip-> åpen ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close ();  $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

La oss også lage våre visningsmaler, og så ser vi hvordan det fungerer helt.

Opprett en visningsmalenfil application / visninger / file_upload_form.php med følgende innhold.

    Velkommen til CodeIgniter    

Last opp fil

Det oppretter en enkel filopplastingsskjema slik at brukeren kan laste opp zip-filen! Vær oppmerksom på at jeg har holdt det på et minimum for enkelhets skyld.

Deretter la vi opprette en visningsmalenfil application / visninger / file_upload_result.php.

    Velkommen til CodeIgniter    

Last opp filresultat

"><< Back to File Uploader

Når filen er lastet opp og hentet, vil brukeren bli vist ovenstående mal.

La oss nå komme tilbake til vår kontroller og gå gjennom hver metode.

I konstruktøren til vår kontroller har vi lastet inn den innebygde skjema og url CodeIgniter hjelpere, slik at vi kan bruke hjelperfunksjoner som form_open_multipart, site_url o.l.

Neste, la oss ta en titt på index metode.

offentlig funksjonsindeks () $ this-> load-> view ('file_upload_form'); 

Trenger dette noen forklaring? Den kaller visningen file_upload_form og gjør siden. Så når du åpner http: // my-codeingiter-site / unzip, bør det vise et enkelt filopplastingsskjema som vist nedenfor.

Vær også oppmerksom på at handlingen av skjemaet vårt er unzip / opplasting hvor dataene vil bli lagt ut. Vi har brukt form_open_multipart hjelper til å generere flertallformetiketten!

Deretter må vi implementere laste opp handlingsmetode som håndterer filopplasting og utvinning. Ta tak i koden til den fra Unzip.php kontrolleren.

offentlig funksjon opplasting () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); hvis (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  ellers $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ zip = ny ZipArchive; hvis ($ zip-> åpen ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close ();  $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

Hvis du er kjent med filopplasting i CodeIgniter, bør koden ikke se fremmed til deg. For de som ikke er kjent, er det ingenting å bekymre seg for, da de innebygde opplastings-APIene i CodeIgniter gjør det til en bris.

Følgende kode laster opplastingsbiblioteket med noen initial konfigurasjon levert av $ config array variabel.

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

Vi har konfigurert det slik at den opplastede filen blir plassert under opplastinger katalog i roten av programmet, og brukeren får lov til å laste opp bare zip-filer.

Deretter har vi sjekket om filopplastingen har mislyktes, og hvis det er tilfelle, henter vi en nyttig feilmelding og tilordner den til $ params slik at vi kan vise det i malen.

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

I så fall lastes filen opp, slik at neste trinn får filbanen til den opplastede filen.

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

Til slutt organiserer vi et ZipArchive-objekt, åpner zip-filen, og trekker den ut til opplastinger katalog.

$ zip = ny ZipArchive; hvis ($ zip-> åpen ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip> close (); 

Var ikke så greit?

Det eneste vi er igjen med er å ringe file_upload_result se, og her er hvordan det skal se ut!

Så det er den andre delen av historien!

Refactor Unzipping Code til et bibliotek

Du ville ha lagt merke til at laste opp Metoden inneholder ZipArchive-koden som trekker ut den opplastede filen. Hva om du trenger å bruke den koden på flere steder? Du kan bli fristet til å kopiere og lime inn koden etter behov.

Faktisk er det en bedre måte som CodeIgniter lar deg sentralisere kode som kan brukes i hele applikasjonen. Du kan opprette et tilpasset bibliotek.

Gå videre og lag en fil application / bibliotek / Extractor.php med følgende innhold.

CI = & get_instance (); $ this-> zip = new ZipArchive;  offentlig funksjon ekstrakt ($ source_file, $ dest_dir) if ($ this-> zip-> open ($ source_file) === TRUE) $ this-> zip-> extractTo ($ dest_dir); $ Dette-> zip> close (); 

Nå, fortsett og erstatt laste opp metode i din Unzip.php kontrolleren med den følgende.

offentlig funksjon opplasting () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); hvis (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  ellers $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ Dette-> last> bibliotek ( 'ekstraktor'); $ this-> extractor-> extract ($ full_path, FCPATH. '/ opplastinger /'); $ params = array ('success' => 'Extracted successfully!');  $ this-> load-> view ('file_upload_result', $ params); 

Som du kan se, har vi lastet inn vårt tilpassede bibliotek og brukt det til å trekke ut innholdet!

$ Dette-> last> bibliotek ( 'ekstraktor'); $ this-> extractor-> extract ($ full_path, FCPATH. '/ opplastinger /');

Ganske kul, hei?

Og ja, det er slutten på denne artikkelen.

Konklusjon

Jeg håper du har hatt glede av denne artikkelen, der vi begynte å utforske kjerne zip-biblioteket av CodeIgniter-rammen og forskjellige måter du kan lage et zip-arkiv på. I den andre delen forklarte jeg hvordan du kan pakke ut brukeropplastede filer ved hjelp av ZipArchive PHP-utvidelsen.

I prosessen fikk vi også muligheten til å konvertere vår kode til egendefinert CodeIgniter-bibliotek, og det er noe av en kirsebær på toppen, jeg vil si!

Gi meg beskjed hvis du kommer opp med spørsmål og forslag som du kan skyte ved å bruke feedet under.