Dateien in CodeIgniter komprimieren und entpacken

In der ersten Hälfte dieses Lernprogramms werden verschiedene Methoden zum Erstellen einer ZIP-Datei mithilfe der integrierten CodeIgniter-APIs beschrieben. Wir werden sehen, wie Sie ZIP-Dateien auf dem Server erstellen und speichern und wie Sie sie auch Endbenutzern zum Download zur Verfügung stellen können.

In der zweiten Hälfte wird erläutert, wie Sie die Datei entpacken können. Um dies zu demonstrieren, erstellen wir eine benutzerdefinierte Seite, auf der Benutzer ZIP-Dateien hochladen können, die nach dem erfolgreichen Hochladen der Datei auf dem Server extrahiert werden. Um die gewünschte Funktionalität zu erreichen, hilft uns die ZipArchive PHP-Erweiterung!

Bevor wir loslegen und in die Entwicklungsarbeit eintauchen, werde ich die Dateien auflisten, die wir im Verlauf dieses Tutorials entwickeln werden:

  • Anwendung / Controller / Zip.php: Dies ist eine Controller-Datei, die verschiedene Möglichkeiten zeigt, wie Sie eine ZIP-Datei erstellen können.
  • Anwendung / Steuerungen / Unzip.php: Dies ist eine Controller-Datei, die den Code zum Entpacken einer vom Benutzer hochgeladenen Datei enthält.
  • application / views / file_upload_form.php : Es handelt sich um eine Ansichtsdatei, die ziemlich einfachen Code zum Hochladen von HTML-Dateien enthält.
  • application / views / file_upload_result.php: Dies ist eine Ansichtsdatei, die das Ergebnis einer vom Benutzer hochgeladenen Datei zeigt. Im Grunde sagt es Ihnen, ob die Datei erfolgreich entpackt wurde.
  • Anwendung / Bibliotheken / Extractor.phpDiese Datei veranschaulicht das Konzept einer benutzerdefinierten Bibliothek in CodeIgniter.

Wenn alles vorhanden ist, können wir mit dem nächsten Abschnitt fortfahren!

Wie man Dateien zippt?

Fahren Sie fort und erstellen Sie eine Datei Anwendung / Controller / Zip.php mit folgenden Inhalten.

load-> library ('zip');  private Funktion _archieve_and_download ($ filename) // Zip-Datei auf dem Server erstellen $ this-> zip-> archive (FCPATH. '/ uploads /' .$ Dateiname); // Benutzer auffordern, die ZIP-Datei herunterzuladen $ this-> zip-> download ($ filename);  public function data () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ this -> _ 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 ($ files); $ this -> _ 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'); $ this -> _ archieve_and_download ('my_info.zip');  public function files () $ this -> _ load_zip_lib (); // zweites Argument als TRUE übergeben, wenn die Struktur beibehalten werden soll $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ this-> zip-> read_file (FCPATH. '/ uploads / 2.jpg'); $ this -> _ archieve_and_download ('images.zip');  public function dir () $ this -> _ load_zip_lib (); // Zweites Argument als FALSE übergeben, wenn vorhergehende Verzeichnisse ignoriert werden sollen $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ this -> _ archieve_and_download ('dir_images.zip'); 

Es ist eine ziemlich standardmäßige Controller-Datei, mit der Sie bereits vertraut sind. Es enthält mehrere Methoden, und jede davon zeigt eine andere Methode zum Erstellen einer ZIP-Datei.

Abgesehen davon bietet es zwei private Methoden, _load_zip_lib und _archieve_and_download, Das sind die übrigen Methoden. Natürlich müssen Sie diese Methoden nicht implementieren, aber wir haben unseren Code gerade überarbeitet, damit Sie nicht den gleichen Code in anderen Methoden wiederholen. Lassen Sie uns zuerst diese beiden Methoden durchgehen.

Hier ist was für die Methode _load_zip_lib sieht aus wie.

private Funktion _load_zip_lib () $ this-> load-> library ('zip'); 

Es lädt die integrierte ZIP-Bibliothek des CodeIgniter-Frameworks, sodass Sie die Funktionen dieser Bibliothek im gesamten Rest des Codes verwenden können. Jetzt können Sie mit der auf die ZIP-Bibliothek zugreifen $ this-> zip Konvention.

Als nächstes gibt es die _archieve_and_download Methode.

private Funktion _archieve_and_download ($ filename) // Zip-Datei auf dem Server erstellen $ this-> zip-> archive (FCPATH. '/ uploads /' .$ Dateiname); // Benutzer auffordern, die ZIP-Datei herunterzuladen $ this-> zip-> download ($ filename); 

Da wir die zip-Bibliothek geladen haben, können Sie die von ihr bereitgestellten Methoden verwenden. Mit der Archivierungsmethode können Sie eine ZIP-Datei unter dem Pfad erstellen, der als erstes Argument angegeben ist. Andererseits fordert die Download-Methode den Benutzer zum Dateidownload auf.

Machen Sie sich keine Sorgen, wenn Sie sich über den Inhalt unserer ZIP-Datei wundern, da wir das gleich sehen werden.

Alles ist vorhanden, also sind wir bereit zu rollen!

Lass uns den Code der Daten Methode. Diese Methode zeigt Ihnen, wie Sie Dateien im Handumdrehen erstellen und sie in eine ZIP-Datei packen.

public function data () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'Web Developer'); $ this -> _ archieve_and_download ('my_info.zip'); 

Zu Beginn haben wir das angerufen _load_zip_lib Methode, die die zip-Bibliothek lädt. Als nächstes haben wir die verwendet Daten hinzufügen Methode der zip-Klasse, mit der Sie eine Datei erstellen und gleichzeitig mit Inhalten füllen können! Natürlich ist es auch im Archiv enthalten!

Das erste Argument sollte der Name der Datei sein und das zweite Argument enthält den Inhalt der Datei.

Wie Sie sehen können, haben wir zwei Dateien hinzugefügt, name.txt und profile.txt, mit einigen Demo-Inhalten. Zum Schluss rufen wir an _archieve_and_download mit my_info.zip als ein Argument dieser Methode. Was tut es?

  • Es wird eine ZIP-Datei erstellt my_info.zip unter Ihrem Upload-Verzeichnis.
  • Außerdem wird ein Benutzer zum Herunterladen von Dateien aufgefordert, und der Name, unter dem die Datei gespeichert wird, lautet my_info.zip.

Stellen Sie also sicher, dass Sie eine erstellt haben Uploads Verzeichnis im Stammverzeichnis Ihrer Site. Machen Sie es auch für den Webserver-Benutzer schreibbar. Fahren Sie nun fort und führen Sie "http: // meine-codeingiter-site / zip / data" aus, um die Dinge in Aktion zu sehen!

Wenn Sie Probleme haben, können Sie mich in den Kommentaren fragen!

Als nächstes gibt es die Datenarray Methode.

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

Diese Methode ist identisch mit der der letzten, die wir gerade besprochen haben, mit der Ausnahme, dass wir ein Array von Dateien zur Verfügung gestellt haben Daten hinzufügen Methode statt einzelner Dateien!

Als nächstes wollen wir uns den Code von 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'); $ this -> _ archieve_and_download ('my_info.zip'); 

Nur für den Fall, dass Sie Ihre Dateien in bestimmten Verzeichnissen organisieren möchten, müssen Sie die Daten hinzufügen Mit dieser Methode können Sie sie auch erstellen. Die resultierende Ausgabe der obigen Methode unterscheidet sich nicht von der Ausnahme name.txt und profile.txt Dateien werden in der Info Verzeichnis.

Obwohl die Daten hinzufügen Diese Methode bietet eine nette Funktion, mit der Sie Dateien schnell erstellen können. In den meisten Fällen müssen Sie vorhandene Dateien auf dem Server komprimieren. Auf jeden Fall ist das genau das Thema unserer nächsten Methoden.

Lass uns schnell einen Blick auf unser nächstes werfen Dateien Methode sieht aus wie. Es erstellt eine ZIP-Datei unter der Uploads Verzeichnis.

öffentliche Funktionsdateien () $ this -> _ load_zip_lib (); // zweites Argument als TRUE übergeben, wenn die Struktur beibehalten werden soll $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ this-> zip-> read_file (FCPATH. '/ uploads / 2.jpg'); $ this -> _ archieve_and_download ('images.zip'); 

Der Zweck der read_file Die Methode ist, die vorhandene Datei auf dem Server zu lesen und sie dem Archiv hinzuzufügen. Wie Sie sehen können, haben wir die beiden Dateien hinzugefügt 1.jpg und 2.jpg zum Archiv. Diese beiden Dateien müssen natürlich unter der Uploads Verzeichnis im Stammverzeichnis Ihrer Site.

Wenn du bestanden hast WAHR als zweites Argument der read_file Bei dieser Methode behält die resultierende ZIP-Datei die genaue Verzeichnisstruktur bei, in der die Datei abgelegt wurde.

Versuchen Sie, http: // my-codeingiter-site / zip / files auszuführen, und überprüfen Sie das Ergebnis!

Die letzte Methode in diesem Segment ist die dir Methode. Es wird ein ZIP-Archiv des gesamten Verzeichnisses erstellt.

öffentliche Funktion dir () $ this -> _ load_zip_lib (); // Zweites Argument als FALSE übergeben, wenn vorhergehende Verzeichnisse ignoriert werden sollen $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ this -> _ archieve_and_download ('dir_images.zip'); 

Du kannst den ... benutzen read_dir Methode, wenn Sie anstelle bestimmter Dateien ein ZIP-Archiv des gesamten Verzeichnisses erstellen möchten. In unserem obigen Beispiel wird ein erstellt dir_images.zip Datei, die alle Dateien unter enthält / Uploads / Bilder / Verzeichnis.

Hierbei ist zu beachten, dass die gesamte Verzeichnisstruktur standardmäßig in der ZIP-Datei beibehalten wird. Aber wenn Sie es ignorieren möchten, passen Sie einfach auf FALSCH als zweites Argument der read_dir Methode. In diesem Fall wird nur ein erstellt Bilder Verzeichnis in der ZIP-Datei.

Damit endet unsere Geschichte, wie Sie ein ZIP-Archiv mit verschiedenen Methoden der integrierten ZIP-Klasse erstellen.

So entpacken Sie Dateien?

Leider gibt es keine integrierte CodeIgniter-Bibliothek, mit der das ZIP-Archiv entpackt werden kann. Aber die ZipArchive PHP-Erweiterung macht es zu einem Kinderspiel, wie wir gleich sehen werden.

Wir werden ein recht einfaches Beispiel erstellen, das zeigt, wie vom Benutzer hochgeladene Dateien entpackt werden.

Fahren Sie fort und erstellen Sie eine Datei Anwendung / Steuerungen / Unzip.php mit folgenden Inhalten.

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']; / **** ohne Bibliothek **** / $ zip = neues ZipArchive; if ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ zip-> close ();  $ params = array ('success' => 'erfolgreich extrahiert!');  $ this-> load-> view ('file_upload_result', $ params); 

Lassen Sie uns auch unsere Ansichtsvorlagen erstellen, und dann werden wir sehen, wie alles funktioniert.

Erstellen Sie eine Ansichtsvorlagendatei application / views / file_upload_form.php mit folgenden Inhalten.

    Willkommen bei CodeIgniter    

Datei hochladen

Es erstellt ein einfaches Formular zum Hochladen von Dateien, sodass der Benutzer die ZIP-Datei hochladen kann! Bitte beachten Sie, dass ich es der Einfachheit halber auf ein Minimum beschränkt habe.

Als Nächstes erstellen wir eine Ansichtsvorlagendatei application / views / file_upload_result.php.

    Willkommen bei CodeIgniter    

Dateiergebnis hochladen

"><< Back to File Uploader

Sobald die Datei hochgeladen und extrahiert wurde, wird dem Benutzer die obige Vorlage angezeigt.

Lassen Sie uns nun zu unserem Controller zurückkehren und jede Methode durchgehen.

Im Konstruktor unseres Controllers haben wir das eingebaute geladen bilden und url CodeIgniter-Helfer, damit wir Hilfsfunktionen wie verwenden können form_open_multipart, Seiten-URL und dergleichen.

Als nächstes sehen wir uns das an Index Methode.

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

Braucht das eine Erklärung? Es ruft die Ansicht auf file_upload_form und rendert die Seite. Wenn Sie also auf http: // my-codeingiter-site / unzip zugreifen, sollte ein einfaches Formular zum Hochladen von Dateien angezeigt werden (siehe unten).

Beachten Sie auch, dass die Aktion unseres Formulars ist entpacken / hochladen wo die Daten veröffentlicht werden. Wir haben die verwendet form_open_multipart Helfer zum Generieren des mehrteiligen Formular-Tags!

Als nächstes müssen wir das implementieren hochladen Aktionsmethode, die das Hochladen und Extrahieren von Dateien behandelt. Holen Sie sich den Code von der Unzip.php Regler.

öffentliche Funktion 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 = neues ZipArchive; if ($ zip-> open ($ full_path) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ zip-> close ();  $ params = array ('success' => 'erfolgreich extrahiert!');  $ this-> load-> view ('file_upload_result', $ params); 

Wenn Sie mit dem Hochladen von Dateien in CodeIgniter vertraut sind, sollte der Code Ihnen nicht fremd erscheinen. Für diejenigen, die nicht vertraut sind, gibt es nichts zu befürchten, da die integrierten Upload-APIs in CodeIgniter es zum Kinderspiel machen.

Mit dem folgenden Code wird die Upload-Bibliothek mit einer anfänglichen Konfiguration geladen, die vom bereitgestellt wird $ config Array-Variable.

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

Wir haben es so konfiguriert, dass die hochgeladene Datei unter der Uploads Verzeichnis im Stammverzeichnis der Anwendung, und der Benutzer darf nur ZIP-Dateien hochladen.

Als Nächstes haben wir geprüft, ob der Upload der Datei fehlgeschlagen ist. In diesem Fall rufen wir eine hilfreiche Fehlermeldung ab und weisen sie zu $ params damit wir es in der Vorlage anzeigen können.

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

In diesem Fall wird die Datei erfolgreich hochgeladen. Der nächste Schritt besteht darin, den Dateipfad der hochgeladenen Datei abzurufen.

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

Zum Schluss instanziieren wir ein ZipArchive-Objekt, öffnen unsere ZIP-Datei und extrahieren sie in die Uploads Verzeichnis.

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

War das nicht einfach??

Das einzige, was uns übrig bleibt, ist die file_upload_result Ansicht, und so sollte es aussehen!

Das ist der andere Teil der Geschichte!

Den Entpackungscode in eine Bibliothek umwandeln

Sie hätten das bemerkt hochladen Diese Methode enthält den ZipArchive-Code, der die hochgeladene Datei extrahiert. Was ist, wenn Sie diesen Code an mehreren Stellen verwenden müssen? Sie könnten versucht sein, den Code nach Bedarf zu kopieren und einzufügen.

In der Tat gibt es eine bessere Möglichkeit, mit CodeIgniter Code zu zentralisieren, der in der gesamten Anwendung verwendet werden kann. Sie könnten eine benutzerdefinierte Bibliothek erstellen.

Fahren Sie fort und erstellen Sie eine Datei Anwendung / Bibliotheken / Extractor.php mit folgenden Inhalten.

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

Gehen Sie jetzt vor und ersetzen Sie das hochladen Methode in Ihrem Unzip.php Controller mit dem folgenden.

öffentliche Funktion 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 ('success' => 'erfolgreich extrahiert!');  $ this-> load-> view ('file_upload_result', $ params); 

Wie Sie sehen, haben wir unsere benutzerdefinierte Bibliothek geladen und zum Extrahieren des Inhalts verwendet!

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

Ziemlich cool, huh?

Und ja, das ist das Ende dieses Artikels.

Fazit

Ich hoffe, Ihnen hat dieser Artikel gefallen, in dem wir die grundlegende ZIP-Bibliothek des CodeIgniter-Frameworks und verschiedene Möglichkeiten zum Erstellen eines ZIP-Archivs erforscht haben. Im zweiten Teil habe ich erklärt, wie Sie vom Benutzer hochgeladene Dateien mit der ZipArchive-PHP-Erweiterung entpacken können.

Dabei hatten wir auch die Möglichkeit, unseren Code in eine benutzerdefinierte CodeIgniter-Bibliothek umzuwandeln, und das ist etwas ganz Besonderes, würde ich sagen!

Teilen Sie mir bitte mit, wenn Sie Fragen und Vorschläge haben, die Sie mit dem folgenden Feed aufnehmen könnten.