Wie man Dateien in PHP zippt und entpackt

Das Komprimieren von Dateien bei der Übertragung über das Internet hat viele Vorteile. In den meisten Fällen verringert sich die Gesamtgröße aller Dateien im komprimierten Format um einen schönen Rand. Dies bedeutet, dass Sie etwas von Ihrer Bandbreite einsparen, und die Benutzer werden auch schnellere Downloadgeschwindigkeiten erhalten. Sobald die Benutzer eine Datei heruntergeladen haben, können sie sie jederzeit dekomprimieren. Kurz gesagt, die Komprimierung kann das Servieren von Dateien über das Internet für Sie und Ihre Besucher erheblich erleichtern.

Ein Faktor, der Sie davon abhalten kann, Dateien zu komprimieren oder den Prozess sehr ermüdend zu gestalten, ist die Tatsache, dass Sie dies möglicherweise manuell tun. Glücklicherweise enthält PHP viele Erweiterungen, die sich speziell mit der Dateikomprimierung und -extraktion befassen. Sie können die in diesen Erweiterungen verfügbaren Funktionen verwenden, um Dateien in PHP automatisch zu komprimieren.

In diesem Lernprogramm erfahren Sie, wie Sie Dateien in ein ZIP-Archiv in PHP komprimieren und entpacken (komprimieren und extrahieren). Sie erfahren auch, wie Sie Dateien in einem Archiv löschen oder umbenennen können, ohne sie vorher zu extrahieren.

Dateien in PHP komprimieren

Das PHP ZipArchive class hat viele Eigenschaften und Methoden, mit denen Sie alle Ihre Dateien komprimieren und dekomprimieren können.

Einzelne Dateien komprimieren

Sie können Dateien einzeln zu Ihrem ZIP-Archiv hinzufügen oder das gesamte Verzeichnis auf einmal hinzufügen. In beiden Fällen ist der erste Schritt das Erstellen eines neuen ZipArchive Instanz und dann die offen ($ dateiname, [$ flags]) Methode. Diese Methode öffnet ein neues ZIP-Archiv zum Lesen, Schreiben oder für andere Änderungen. Es gibt vier gültige Werte für das optionale $ flag Parameter, die bestimmen, wie mit unterschiedlichen Situationen umgegangen werden soll.

  • ZipArchive :: OVERWRITE-Dieses Flag überschreibt den Inhalt des angegebenen Archivs, falls er bereits vorhanden ist.
  • ZipArchive :: CREATE-Dieses Flag erstellt ein neues Archiv, falls es noch nicht vorhanden ist.
  • ZipArchive :: EXCL-Dieses Flag führt zu einem Fehler, wenn das Archiv bereits vorhanden ist.
  • ZipArchive :: CHECKCONS-Dieses Flag weist PHP an, zusätzliche Konsistenzprüfungen für das Archiv durchzuführen und einen Fehler zu melden, falls diese fehlschlagen.

In der Dokumentation dieser Methode können Sie verschiedene Fehlercodes nachlesen, die bei einem Fehler beim Öffnen der Datei zurückgegeben werden. Wenn die ZIP-Datei erfolgreich geöffnet oder erstellt wurde, wird die Methode zurückgegeben wahr.

Nachdem Sie das Archiv erfolgreich geöffnet haben, können Sie die addFile ($ dateiname, $ localname, $ start, $ length) Methode, um eine beliebige Datei aus einem bestimmten Pfad zu Ihrem Archiv hinzuzufügen. Das $ Dateiname Parameter ist der Pfad einer Datei, die Sie dem Archiv hinzufügen möchten. Das $ localname Über den Parameter wird der Datei ein Name zugewiesen, um sie im Archiv zu speichern. Du kannst anrufen Datei hinzufügen() jedes Mal, wenn Sie Ihrem Archiv eine neue Datei hinzufügen möchten.

Nachdem Sie dem Archiv alle erforderlichen Dateien hinzugefügt haben, rufen Sie einfach die schließen() Methode, um es zu schließen und die Änderungen zu speichern.

Angenommen, Sie verfügen über eine Website, auf der Benutzer Schriftdateien für verschiedene Schriftarten sowie Lizenzinformationen herunterladen können, um sie zu verwenden. Dateien wie diese sind perfekte Beispiele für die automatisierte Archivierung mit PHP. Der folgende Code zeigt Ihnen, wie Sie genau das tun.

open ('komprimierte / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('fonts / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('fonts / Monoton / OFL.txt', 'license.txt'); $ zip-> close (); ?>

Wir beginnen mit der Erstellung eines ZipArchive Instanz und dann mit der öffnen() Methode, um unser Archiv zu erstellen. Das Datei hinzufügen() Methode fügt unsere tatsächliche hinzu .ttf Schriftdatei und die .TXT Lizenzdatei zum Archiv.

Sie sollten beachten, dass sich die Originaldateien im Ordner befanden Schriftarten / Monoton Verzeichnis. Der PHP-Code platziert ihn jedoch direkt in der Wurzel unseres Archivs. Sie können die Verzeichnisstruktur sowie die Namen der Dateien, die ins Archiv gehen, ändern.

Mehrere Dateien aus einem Verzeichnis komprimieren

Das Hinzufügen einzelner Dateien zu Ihrem Archiv kann nach einiger Zeit ermüdend werden. Sie möchten beispielsweise ein Archiv aller erstellen .pdf oder .png Dateien in einem Verzeichnis. Das addGlob ($ pattern, $ flags, $ options) Methode wird sich in diesem Fall als sehr hilfreich erweisen. Der einzige Nachteil dieser Methode besteht darin, dass Sie die Kontrolle über den Speicherort einzelner Dateien im Archiv verlieren. Sie können die Verzeichnisstruktur innerhalb des Archivs jedoch weiterhin mit Hilfe von beeinflussen $ options Parameter. Die Optionen werden in Form eines assoziativen Arrays übergeben.

  • add_path-Der Wert, den Sie zuweisen add_path wird dem lokalen Pfad der Datei innerhalb des Archivs vorangestellt.
  • remove_path-Der Wert, den Sie zuweisen remove_path wird verwendet, um ein übereinstimmendes Präfix aus dem Pfad verschiedener Dateien zu entfernen, die dem Archiv hinzugefügt werden.
  • remove_all_path-Wert von einstellen remove_all_path zu wahr entfernt alles außer dem Namen der Datei aus dem Pfad der Datei. In diesem Fall werden die Dateien zum Stammverzeichnis des Archivs hinzugefügt.

Beachten Sie, dass das Entfernen eines Pfads vor dem Präfix des in angegebenen Werts erfolgt add_path.

Der folgende Codeausschnitt macht die Verwendung von addGlob () und alle diese Optionen klarer.

$ zip = new ZipArchive (); $ zip-> open ('compress / user_archive.zip', ZipArchive :: CREATE); $ options = array ('add_path' => 'light_wallpapers /', 'remove_all_path' => TRUE); $ zip-> addGlob ('lights / *. jpg', 0, $ options); $ options = array ('add_path' => 'font_files /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. ttf', 0, $ options); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. pdf', 0, $ options); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. jpg, png', GLOB_BRACE, $ options); $ zip-> close ();

Wie üblich beginnen wir mit der Erstellung einer ZipArchive Instanz und dann die öffnen() Methode, um unser Archiv zu erstellen. Wir geben auch unterschiedliche Werte für die an add_path geben Sie den ein $ options Array vor jedem Aufruf des addGlob () Methode. Auf diese Weise können wir jeweils nur einen bestimmten Dateisatz bearbeiten und entsprechend Archivierungsoptionen bereitstellen.

Im ersten Fall durchlaufen wir alle .jpg Dateien in der Beleuchtung Verzeichnis und legen Sie sie in das Lichttapeten Verzeichnis im Archiv. In ähnlicher Weise durchlaufen wir alle .ttf Dateien in der Unterlagen Verzeichnis und legen Sie sie in einen Ordner namens font_files in unserem Archiv. Zum Schluss wiederholen wir alles .jpg und .png Dateien in unseren Dokumenten auf einmal und legen sie alle in der Bilder Verzeichnis.

Wie Sie sehen, sind die Werte im $ options Parameter sind nützlich, um den Inhalt im Archiv zu organisieren.

Inhalt aus einem Archiv extrahieren

Das ZipArchive Klasse hat eine Methode aufgerufen extractTo ($ destination, $ entries) um den Inhalt eines Archivs zu extrahieren. Sie können damit entweder alles aus dem Archiv oder nur bestimmte Dateien extrahieren. Das $ Einträge Parameter kann verwendet werden, um einen einzelnen Dateinamen anzugeben, der extrahiert werden soll, oder Sie können ihn verwenden, um ein Array von Dateien zu übergeben.

Ein wichtiger Punkt ist, dass Sie den richtigen Pfad der Datei im Archiv angeben müssen, um sie zu extrahieren. Zum Beispiel haben wir eine Fontdatei mit dem Namen archiviert AlegreyaSans-Light.ttf im vorherigen Abschnitt. Die Datei wurde im Archiv in einem Verzeichnis gespeichert font_files. Das bedeutet, dass Sie den Pfad angeben müssen $ Einträge Parameter wäre font_files / AlegreyaSans-Light.ttf und nicht einfach AlegreyaSans-Light.ttf.

Die Verzeichnis- und Dateistruktur bleibt während des Extraktionsvorgangs erhalten, und die Dateien werden in die entsprechenden Verzeichnisse extrahiert.

open ('compress / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ zip-> close (); ?>

Wenn Sie den zweiten Parameter nicht angeben, extrahiert die Methode alle Dateien im Archiv.

Erhalten Sie mehr Kontrolle über die Archive

Das ZipArchive class verfügt auch über viele andere Methoden und Eigenschaften, mit denen Sie weitere Informationen zum Archiv abrufen können, bevor Sie den gesamten Inhalt extrahieren.

Mit dem können Sie die Anzahl der Dateien in einem Archiv zählen Anzahl() Methode. Eine andere Möglichkeit ist die Verwendung der numFiles Eigentum. Sie können verwendet werden, um alle Dateien im Archiv zu durchlaufen und nur die Dateien zu extrahieren, die Sie benötigen - oder Sie können etwas anderes damit tun, beispielsweise das Entfernen der Dateien aus dem Archiv.

Im folgenden Beispiel löschen wir alle Dateien im Archiv, die das Wort enthalten Kursiv. Ein ähnlicher Code könnte verwendet werden, um alle Dateien zu löschen, die kein bestimmtes Wort enthalten. Sie können auch diese Dateien durchlaufen und ein bestimmtes Wort durch etwas anderes ersetzen.

open ('compress / user_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); für ($ i = 0; $ i < $file_count; $i++)  $file_name = $zip->getNameIndex ($ i); if (stripos ($ dateiname, 'kursiv')! == false) $ zip-> deleteName ($ dateiname);  $ zip-> close (); ?>

In dem obigen Code verwenden wir deleteName () eine einzelne Datei löschen. Sie können es jedoch auch verwenden, um ein gesamtes Verzeichnis zu löschen.

Eine ähnliche Funktion RenameName ($ oldname, $ newname) kann verwendet werden, um den Namen aller Dateien im Archiv zu ändern. Sie erhalten eine Fehlermeldung, wenn eine Datei den Titel hat $ newname ist bereits vorhanden.

Abschließende Gedanken

Wir haben eine Reihe sehr nützlicher Methoden der ZipArchive Klasse, die die automatisierte Komprimierung und Extraktion von Dateien in PHP zu einem Kinderspiel macht. Sie sollten jetzt in der Lage sein, einzelne Dateien oder eine Gruppe davon auf der Grundlage Ihrer eigenen Kriterien gleichzeitig zu komprimieren. Ebenso sollten Sie in der Lage sein, eine bestimmte Datei aus dem Archiv zu extrahieren, ohne den Inhalt zu beeinträchtigen.

Mit der Hilfe von Anzahl() und numFiles, Sie erhalten mehr Kontrolle über die einzelnen Dateien und das Umbenennen oder Löschen dieser Dateien ist sehr einfach. Sie sollten die Dokumentation mindestens einmal durchlesen, um mehr über solche Funktionen zu erfahren.