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!
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?
my_info.zip
under laste opp katalogen din.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.
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!
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.
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.