Hoe bestanden zip-en unzippen in CodeIgniter

De eerste helft van deze tutorial legt uit verschillende manieren waarop u een zip-bestand kunt maken met behulp van ingebouwde API's van CodeIgniter. We zullen zien hoe u zip-bestanden op de server kunt maken en opslaan en hoe u ze ook beschikbaar kunt maken voor downloaden naar eindgebruikers.

In de tweede helft wordt besproken hoe je het bestand kunt unzippen. Om dat aan te tonen, bouwen we een aangepaste pagina waarmee gebruikers zip-bestanden kunnen uploaden die op de server worden uitgepakt na het uploaden van het bestand. Om de gewenste functionaliteit te bereiken, helpt de ZipArchive PHP-extensie ons te helpen!

Voordat we verder gaan en een duik nemen in de ontwikkelingsdingen, zal ik een lijst maken van de bestanden die we gaan ontwikkelen in de loop van deze tutorial:

  • application / controllers / Zip.php: Het is een controllerbestand dat verschillende manieren toont om een ​​zipbestand te maken.
  • application / controllers / Unzip.php: Het is een controllerbestand dat de code bevat die wordt gebruikt om een ​​door een gebruiker geüploade bestand te unzippen.
  • application / views / file_upload_form.php : Het is een weergavebestand met een vrij eenvoudige HTML-bestands-upload-code.
  • application / views / file_upload_result.php: Het is een weergavebestand dat het resultaat toont van een door een gebruiker geüploade bestand; eigenlijk vertelt het u of het bestand succesvol is uitgepakt.
  • application / libraries / Extractor.php: Dit bestand demonstreert het concept van een aangepaste bibliotheek in CodeIgniter.

Met alles op zijn plaats, zijn we klaar om verder te gaan naar onze volgende sectie!

Hoe bestanden zip-bestanden?

Ga je gang en maak een bestand aan application / controllers / Zip.php met de volgende inhoud.

load> library ( 'zip');  private functie _archieve_and_download ($ filename) // maak zip-bestand op server $ this-> zip-> archive (FCPATH. '/ uploads /'.$ bestandsnaam); // prompt gebruiker om het zip-bestand $ this-> zip-> download ($ filename) te downloaden;  public function data () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('naam.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); deze $ -> _ archieve_and_download ( 'my_info.zip');  public function data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer'); $ This-> zip-> add_data ($ bestanden); deze $ -> _ archieve_and_download ( 'my_info.zip');  public function 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'); deze $ -> _ archieve_and_download ( 'my_info.zip');  openbare functiebestanden () $ this -> _ load_zip_lib (); // geef het tweede argument door als TRUE als u de structuur $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg') wilt behouden; $ This-> zip-> read_file (FCPATH '/ uploads / 2.jpg'.); deze $ -> _ archieve_and_download ( 'images.zip');  openbare functie dir () $ this -> _ load_zip_lib (); // geef het tweede argument door als ONWAAR als u de voorgaande mappen $ this-> zip-> read_dir (FCPATH. '/ uploads / images /') wilt negeren; deze $ -> _ archieve_and_download ( 'dir_images.zip'); 

Het is een vrij standaard controllerbestand dat u al kent. Het bevat verschillende methoden en elk van deze toont u een andere manier om een ​​zip-bestand te maken.

Afgezien daarvan biedt het twee privé-methoden, _load_zip_lib en _archieve_and_download, die worden aangeroepen vanuit de rest van de methoden. U hoeft deze methoden natuurlijk niet te implementeren, maar we hebben onze code zojuist aangepast, zodat u uiteindelijk niet dezelfde code op andere methoden herhaalt. Laten we eerst deze twee methoden doornemen.

Hier is wat de methode _load_zip_lib lijkt op.

persoonlijke functie _load_zip_lib () $ this-> load-> library ('zip'); 

Het laadt de ingebouwde zipbibliotheek van het CodeIgniter-framework zodat u de functies van die bibliotheek in de rest van de code kunt gebruiken. U hebt nu toegang tot de zipbibliotheek met de $ This-> zip conventie.

Vervolgens is er de _archieve_and_download methode.

privéfunctie _archieve_en_download ($ bestandsnaam) // maak zip-bestand op server $ this-> zip-> archive (FCPATH. '/ uploads /'.$ bestandsnaam); // prompt gebruiker om het zip-bestand $ this-> zip-> download ($ filename) te downloaden; 

Aangezien we de zipbibliotheek hebben geladen, kunt u de methoden gebruiken die deze biedt. Met de archiefmethode kunt u een zipbestand maken op het pad dat als eerste argument wordt opgegeven. Aan de andere kant vraagt ​​de downloadmethode de gebruiker om bestanden te downloaden.

Maak je geen zorgen als je je afvraagt ​​over de inhoud van ons zipbestand, zoals we dat zo dadelijk zullen zien.

Alles is op zijn plaats, dus we zijn klaar om te rollen!

Laten we de code van de pakken gegevens methode. Deze methode laat u zien hoe u on-the-fly bestanden kunt maken en deze in een zipbestand kunt verpakken.

openbare functiegegevens () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('naam.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); deze $ -> _ archieve_and_download ( 'my_info.zip'); 

Om te beginnen hebben we de _load_zip_lib methode die de zip-bibliotheek laadt. Vervolgens hebben we de add_data methode van de zip-klasse waarmee u een bestand kunt maken en tegelijkertijd kunt vullen met inhoud! Natuurlijk is het ook aan het archief toegevoegd!

Het eerste argument moet de naam van het bestand zijn en het tweede argument bevat de inhoud die in het bestand wordt gebruikt.

Zoals u kunt zien, hebben we twee bestanden toegevoegd, naam.txt en profile.txt, met wat demo-inhoud. Eindelijk bellen we _archieve_and_download met my_info.zip als een argument van die methode. Wat doet het?

  • Het maakt een zip-bestand my_info.zip onder je uploaddirectory.
  • Het zal ook een gebruiker om bestandsdownload vragen, en de naam waarmee het bestand zal worden opgeslagen is my_info.zip.

Zorg er dus voor dat je een hebt gemaakt uploads map in de hoofdmap van uw site. Maak het ook beschrijfbaar door de webservergebruiker. Ga nu door en voer "http: // mijn-codeingiter-site / zip / data" uit om de dingen in actie te zien!

Als u problemen ondervindt, kunt u mij dit in de opmerkingen vragen!

Vervolgens is er de gegevensmatrix methode.

public function data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Web Developer'); $ This-> zip-> add_data ($ bestanden); deze $ -> _ archieve_and_download ( 'my_info.zip'); 

Deze methode is identiek aan die van de laatste die we zojuist hebben besproken, behalve dat we een array met bestanden hebben verstrekt aan de add_data methode in plaats van individuele bestanden!

Laten we vervolgens de code van de data_with_subdirs methode.

public function 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'); deze $ -> _ archieve_and_download ( 'my_info.zip'); 

Voor het geval u uw bestanden binnen bepaalde mappen wilt organiseren, de add_data methode kunt u ze ook maken. De resulterende uitvoer van de bovenstaande methode zal niet anders zijn, behalve dat de naam.txt en profile.txt bestanden worden geplaatst in de info directory.

Hoewel de add_data methode biedt een leuke functie waarmee je on-the-fly bestanden kunt maken, vaker moet je bestaande bestanden op de server wegpicken. Hoe dan ook, dat is precies het onderwerp van onze volgende paar methoden.

Laten we snel kijken naar onze volgende bestanden methode ziet eruit als. Het maakt een zip van bestanden onder de uploads directory.

openbare functiebestanden () $ this -> _ load_zip_lib (); // geef het tweede argument door als TRUE als u de structuur $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg') wilt behouden; $ This-> zip-> read_file (FCPATH '/ uploads / 2.jpg'.); deze $ -> _ archieve_and_download ( 'images.zip'); 

Het doel van de read_file methode is om het bestaande bestand op de server te lezen en toe te voegen aan het archief. Zoals u kunt zien, hebben we de twee bestanden toegevoegd 1.jpg en 2.jpg naar het archief. Uiteraard moeten die twee bestanden aanwezig zijn onder de uploads map in de hoofdmap van uw site.

Als je slaagt TRUE als het tweede argument van de read_file methode, behoudt het resulterende zipbestand de exacte mapstructuur waarin het bestand is geplaatst.

Probeer http: // mijn-codeingiter-site / zip / bestanden uit te voeren en controleer het resultaat!

De laatste methode in dit segment is de dir methode. Het maakt een zip-archief van de hele map.

publieke functie dir () $ this -> _ load_zip_lib (); // geef het tweede argument door als ONWAAR als u de voorgaande mappen $ this-> zip-> read_dir (FCPATH. '/ uploads / images /') wilt negeren; deze $ -> _ archieve_and_download ( 'dir_images.zip'); 

U kunt de read_dir methode als u een zip-archief van de hele map wilt maken in plaats van bepaalde bestanden. In ons bovenstaande voorbeeld wordt een dir_images.zip bestand dat alle bestanden bevat onder de / Uploads / images / directory.

Het belangrijkste om op te merken is dat de volledige directorystructuur standaard in het zipbestand wordt bewaard. Maar als je het wilt negeren, geef het dan gewoon door VALSE als het tweede argument van de read_dir methode. In dat geval maakt het alleen een afbeeldingen map in het zipbestand.

Dus dat is het einde van ons verhaal over hoe je een zip-archief kunt maken met behulp van verschillende methoden die door de ingebouwde zip-klasse worden geboden.

Hoe bestanden uit te pakken?

Helaas is er geen ingebouwde CodeIgniter-bibliotheek waarmee we het zip-archief kunnen unzippen. Maar de ZipArchive PHP-extensie maakt het een koud kunstje, zoals we in een oogwenk zullen zien.

We zullen een vrij eenvoudig voorbeeld maken dat laat zien hoe je door gebruikers geüploade bestanden kunt unzippen.

Ga je gang en maak een bestand aan application / controllers / Unzip.php met de volgende inhoud.

load-> helper (array ('form', 'url'));  public function index () $ this-> load-> view ('file_upload_form');  public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; / **** zonder bibliotheek **** / $ zip = nieuwe ZipArchive; if ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close ();  $ params = array ('success' => 'Met succes geëxtraheerd!');  $ this-> load-> view ('file_upload_result', $ params); 

Laten we ook onze weergavesjablonen maken en dan zien we hoe het allemaal werkt.

Maak een beeldsjabloonbestand application / views / file_upload_form.php met de volgende inhoud.

    Welkom bij CodeIgniter    

Upload bestand

Het creëert een eenvoudig bestandsupload-formulier, zodat de gebruiker het zip-bestand kan uploaden! Houd er rekening mee dat ik het omwille van de eenvoud tot een minimum heb beperkt.

Laten we vervolgens een beeldsjabloonbestand maken application / views / file_upload_result.php.

    Welkom bij CodeIgniter    

Upload bestandsresultaat

"><< Back to File Uploader

Nadat het bestand is geüpload en uitgepakt, krijgt de gebruiker de bovenstaande sjabloon te zien.

Laten we nu teruggaan naar onze controller en elke methode doorlopen.

In de constructor van onze controller hebben we de ingebouwde schijf geladen het formulier en url CodeIgniter-helpers, zodat we helperfuncties kunnen gebruiken form_open_multipart, SITE_URL en dergelijke.

Laten we vervolgens eens kijken naar de inhoudsopgave methode.

public function index () $ this-> load-> view ('file_upload_form'); 

Heeft dit enige uitleg nodig? Het roept het zicht op file_upload_form en rendert de pagina. Dus wanneer u http: // mijn-codeingiter-site / unzip opent, zou het een eenvoudig bestandsupload-formulier moeten weergeven zoals hieronder getoond.

Merk ook op dat de actie van ons formulier is unzip / upload waar de gegevens worden gepost. We hebben de form_open_multipart helper om de meerdelige formuliertag te genereren!

Vervolgens moeten we de uploaden actiemethode die het uploaden van bestanden en extractie zal verzorgen. Pak de code daarvan van de Unzip.php controleur.

public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ zip = nieuwe ZipArchive; if ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close ();  $ params = array ('success' => 'Met succes geëxtraheerd!');  $ this-> load-> view ('file_upload_result', $ params); 

Als u vertrouwd bent met het uploaden van bestanden in CodeIgniter, zou de code er niet vreemd uit moeten zien. Voor degenen die niet vertrouwd zijn, hoef je je geen zorgen te maken, want de ingebouwde upload-API's in CodeIgniter maken het een fluitje van een cent.

De volgende code laadt de uploadbibliotheek met een initiële configuratie die wordt geleverd door de $ config matrixvariabele.

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

We hebben het zo geconfigureerd dat het geüploade bestand onder de uploads map in de hoofdmap van de toepassing en de gebruiker mag alleen zip-bestanden uploaden.

Vervolgens hebben we gecontroleerd of het uploaden van het bestand is mislukt en als dat het geval is, zullen we een handig foutbericht ophalen en toewijzen aan $ params zodat we het in de sjabloon kunnen weergeven.

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

In het geval dat het bestand met succes is geüpload, is de volgende stap het ophalen van het bestandspad van het geüploade bestand.

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

Ten slotte stellen we een ZipArchive-object voor, openen ons zipbestand en extraheren het naar de uploads directory.

$ zip = nieuwe ZipArchive; if ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ Zip-> close (); 

Was dat niet eenvoudig??

Het enige dat overblijft is om het te bellen file_upload_result bekijken, en hier is hoe het eruit zou moeten zien!

Dus dat is het andere deel van het verhaal!

Refactor de code uitpakken naar een bibliotheek

Je zou hebben gemerkt dat de uploaden methode bevat de ZipArchive-code die het geüploade bestand uitpakt. Wat als u die code op meerdere plaatsen moet gebruiken? U kunt in de verleiding komen om de code te kopiëren en desgewenst te plakken.

Er is inderdaad een betere manier om met CodeIgniter code te centraliseren die overal in de applicatie kan worden gebruikt. U zou een eigen bibliotheek kunnen maken.

Ga je gang en maak een bestand aan application / libraries / Extractor.php met de volgende inhoud.

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

Ga nu door en vervang de uploaden methode in uw Unzip.php controller met de volgende.

public function upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ());  else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ This-> load-> library ( 'extractor'); $ this-> extractor-> extract ($ full_path, FCPATH. '/ uploads /'); $ params = array ('succes' => 'Met succes geëxtraheerd!');  $ this-> load-> view ('file_upload_result', $ params); 

Zoals u kunt zien, hebben we onze aangepaste bibliotheek geladen en gebruikt om de inhoud te extraheren!

$ This-> load-> library ( 'extractor'); $ this-> extractor-> extract ($ full_path, FCPATH. '/ uploads /');

Best cool, he?

En ja, dat is het einde van dit artikel.

Conclusie

Ik hoop dat je dit artikel leuk vond, waarin we begonnen met het verkennen van de centrale zip-bibliotheek van het CodeIgniter-framework en verschillende manieren om een ​​zip-archief te maken. In het tweede deel heb ik uitgelegd hoe je door de gebruiker geüploade bestanden kunt unzippen met behulp van de ZipArchive PHP-extensie.

In dit proces kregen we ook de kans om onze code om te zetten naar een aangepaste CodeIgniter-bibliotheek, en dat is iets van een kers op de top, zou ik zeggen!

Laat het me weten als je met vragen en suggesties komt die je zou kunnen schieten met behulp van de onderstaande feed.