Advertisement
  1. Code
  2. PHP

Wie man Dateien in PHP zippt und entpackt

Scroll to top
Read Time: 8 min

German (Deutsch) translation by Ines Willenbrock (you can also view the original English article)

Das Komprimieren von Dateien bei der Übertragung über das Internet hat viele Vorteile. In den meisten Fällen sinkt die Gesamtgröße aller Dateien im komprimierten Format um ein Vielfaches. Dies bedeutet, dass Sie einen Teil Ihrer Bandbreite sparen und Benutzer auch schnellere Download-Geschwindigkeiten erhalten. Sobald die Benutzer eine Datei heruntergeladen haben, können sie sie jederzeit dekomprimieren. Kurz gesagt, die Komprimierung kann das Bereitstellen von Dateien über das Internet sowohl für Sie als auch für Ihre Besucher erheblich erleichtern.

Ein Faktor, der Sie davon abhalten kann, Dateien zu komprimieren oder den Prozess sehr mühsam zu machen, ist die Tatsache, dass Sie es möglicherweise manuell tun. Glücklicherweise kommt PHP mit vielen Erweiterungen, die sich speziell mit der Dateikomprimierung und -extraktion befassen. Sie können die in diesen Erweiterungen verfügbaren Funktionen verwenden, um Dateien automatisch in PHP zu komprimieren.

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

Komprimieren von Dateien in PHP

Die PHP ZipArchive-Klasse verfügt über viele Eigenschaften und Methoden, mit denen Sie alle Ihre Dateien komprimieren und dekomprimieren können.

Einzelne Dateien komprimieren

Sie können Dateien nacheinander zu Ihrem Zip-Archiv hinzufügen oder das gesamte Verzeichnis auf einmal hinzufügen. In beiden Fällen besteht der erste Schritt darin, eine neue ZipArchive-Instanz zu erstellen und dann die open($filename, [$flags])-Methode aufzurufen. Diese Methode öffnet ein neues Zip-Archiv zum Lesen, Schreiben oder anderen Änderungen. Es gibt vier gültige Werte für den optionalen $flag Parameter, die bestimmen, wie mit verschiedenen Situationen umzugehen ist.

  • ZipArchive::OVERWRITE – Dieses Flag überschreibt den Inhalt des angegebenen Archivs, wenn es bereits vorhanden ist.
  • ZipArchive::CREATE – Dieses Flag erstellt ein neues Archiv, wenn es noch nicht vorhanden ist.
  • ZipArchive::EXCL – Dieses Flag führt zu einem Fehler, wenn das Archiv bereits vorhanden ist.
  • ZipArchive::CHECKCONS – Dieses Flag wird PHP anweist, zusätzliche Konsistenzprüfungen für das Archiv durchzuführen und einen Fehler zu geben, wenn sie fehlschlagen.

Sie können die Dokumentation dieser Methode überprüfen, um mehr über verschiedene Fehlercodes zu erfahren, die bei Fehlern beim Öffnen der Datei zurückgegeben werden. Wenn die ZIP-Datei erfolgreich geöffnet oder erstellt wurde, gibt die Methode true zurück.

Nachdem Sie das Archiv erfolgreich geöffnet haben, können Sie die addFile($filename, $localname, $start, $length)-Methode verwenden, um eine beliebige Datei aus einem bestimmten Pfad zu Ihrem Archiv hinzuzufügen. Der Parameter $filename ist der Pfad einer Datei, die Sie dem Archiv hinzufügen möchten. Der Parameter $localname wird verwendet, um der Datei einen Namen zuzuweisen, um sie im Archiv zu speichern. Sie können addFile() jedes Mal aufrufen, wenn Sie Ihrem Archiv eine neue Datei hinzufügen möchten.

Nachdem Sie alle notwendigen Dateien zum Archiv hinzugefügt haben, können Sie einfach die close()-Methode aufrufen, um es zu schließen und die Änderungen zu speichern.

Nehmen wir an, Sie haben eine Website, auf der Benutzer Schriftartdateien für verschiedene Schriftarten zusammen mit den 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.

1
<?php
2
3
$zip = new ZipArchive();
4
$zip->open('compressed/font_files.zip', ZipArchive::CREATE);
5
 
6
$zip->addFile('fonts/Monoton/Monoton-Regular.ttf', 'Monoton-Regular.ttf');
7
$zip->addFile('fonts/Monoton/OFL.txt', 'license.txt');
8
 
9
$zip->close();
10
11
?>

Wir beginnen mit dem Erstellen einer ZipArchive-Instanz und verwenden dann die open()-Methode, um unser Archiv zu erstellen. Die addFile()-Methode fügt dem Archiv unsere eigentliche .ttf-Schriftartdatei und die .txt Lizenzdatei hinzu.

Sie sollten beachten, dass sich die Originaldateien im Verzeichnis fonts/Monoton befanden. Der PHP-Code platziert es jedoch direkt im Stammverzeichnis unseres Archivs. Sie können die Verzeichnisstruktur sowie die Namen der Dateien im Archiv ändern.

Komprimieren mehrerer Dateien aus einem Verzeichnis

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

  • add_path – Der Wert, den Sie add_path zuweisen, wird dem lokalen Pfad der Datei im Archiv vorangestellt.
  • remove_path – Der Wert, den Sie remove_path zuweisen, wird verwendet, um ein übereinstimmendes Präfix aus dem Pfad verschiedener Dateien zu entfernen, die dem Archiv hinzugefügt werden.
  • remove_all_path – Wenn Sie den Wert von remove_all_path auf true festlegen, wird neben dem Namen alles aus dem Pfad der Datei entfernt. In diesem Fall werden die Dateien dem Stammverzeichnis des Archivs hinzugefügt.

Es ist wichtig, sich daran zu erinnern, dass das Entfernen eines Pfads erfolgt, bevor der in add_path angegebene Wert vorangestellt wird.

Der folgende Codeausschnitt macht die Verwendung von addGlob() und all diesen Optionen klarer.

1
$zip = new ZipArchive();
2
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);
3
 
4
$options = array('add_path' => 'light_wallpapers/', 'remove_all_path' => TRUE);
5
$zip->addGlob('lights/*.jpg', 0, $options);
6
7
$options = array('add_path' => 'font_files/', 'remove_all_path' => TRUE);
8
$zip->addGlob('documents/*.ttf', 0, $options);
9
10
$options = array('add_path' => 'pdf_books/', 'remove_all_path' => TRUE);
11
$zip->addGlob('documents/*.pdf', 0, $options);
12
13
$options = array('add_path' => 'images/', 'remove_all_path' => TRUE);
14
$zip->addGlob('documents/*.{jpg, png}', GLOB_BRACE, $options);
15
 
16
$zip->close();

Wie üblich beginnen wir mit dem Erstellen einer ZipArchive-Instanz und verwenden dann die open()-Methode, um unser Archiv zu erstellen. Außerdem geben wir jedes Mal unterschiedliche Werte für den add_path Schlüssel im $options-Array an, bevor die addGlob()-Methode aufruft. Auf diese Weise können wir mit einem bestimmten Satz von Dateien gleichzeitig umgehen und entsprechende Archivierungsoptionen bereitstellen.

Im ersten Fall iterieren wir alle .jpg Dateien im lights-Verzeichnis und legen sie im light_wallpapers-Verzeichnis im Archiv ab. In ähnlicher Weise iterieren wir alle .ttf Dateien im documents-Verzeichnis und legen sie dann in einem Ordner namens font_files in unserem Archiv ab. Schließlich iterieren wir alle .jpg und .png Dateien in unseren Dokumenten auf einmal und legen sie alle zusammen im images-Verzeichnis ab.

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

Extrahieren von Inhalten aus einem Archiv

Die ZipArchive-Klasse verfügt über eine Methode namens extractTo($destination, $entries), um den Inhalt eines Archivs zu extrahieren. Sie können es verwenden, um entweder alles im Archiv oder nur einige bestimmte Dateien zu extrahieren. Der Parameter $entries 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, an den Sie sich erinnern sollten, ist, dass Sie den richtigen Pfad der Datei im Archiv angeben müssen, um sie zu extrahieren. Zum Beispiel haben wir im vorherigen Abschnitt eine Schriftartdatei namens AlegreyaSans-Light.ttf archiviert. Die Datei wurde im Archiv in einem Verzeichnis namens font_files gespeichert. Dies bedeutet, dass der Pfad, den Sie im Parameter $entries angeben müssen, font_files/AlegreyaSans-Light.ttf und nicht einfach AlegreyaSans-Light.ttf ist.

Das Verzeichnis und die Dateistruktur bleiben während des Extraktionsvorgangs erhalten, und die Dateien werden in ihre jeweiligen Verzeichnisse extrahiert.

1
<?php
2
3
$zip = new ZipArchive();
4
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);
5
$zip->extractTo('uncompressed/', 'font_files/AlegreyaSans-Light.ttf');
6
$zip->close();
7
 
8
?>

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

Erhalten Sie mehr Kontrolle über die Archive

Die ZipArchive-Klasse verfügt auch über viele andere Methoden und Eigenschaften, mit denen Sie weitere Informationen über das Archiv erhalten, bevor Sie den gesamten Inhalt extrahieren.

Sie können die Anzahl der Dateien in einem Archiv mit der count()-Methode zählen. Eine weitere Option ist die Verwendung der numFiles-Eigenschaft. Sie können verwendet werden, um über alle Dateien im Archiv zu iterieren und nur die Dateien zu extrahieren, die Sie benötigen - oder Sie können etwas anderes mit ihnen tun, z. B. sie aus dem Archiv entfernen.

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

1
<?php
2
3
$zip = new ZipArchive();
4
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);
5
6
$file_count = $zip->count();
7
8
for($i = 0; $i < $file_count; $i++) {
9
    $file_name = $zip->getNameIndex($i);
10
11
    if(stripos($file_name, 'Italic') !== false) {
12
        $zip->deleteName($file_name);
13
    }
14
}
15
 
16
$zip->close();
17
18
?>

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

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

Abschließende Gedanken

Wir haben eine Reihe von sehr nützlichen Methoden der ZipArchive-Klasse behandelt, die die automatisierte Komprimierung und Extraktion von Dateien in PHP zum Kinderspiel machen. Sie sollten nun in der Lage sein, einzelne Dateien oder eine Gruppe von ihnen auf einmal basierend auf Ihren eigenen Kriterien zu komprimieren. Ebenso sollten Sie in der Lage sein, eine bestimmte Datei aus dem Archiv zu extrahieren, ohne andere Inhalte zu beeinträchtigen.

Mit Hilfe von count() und numFiles erhalten Sie mehr Kontrolle über die einzelnen Dateien, und das Umbenennen oder Löschen wäre super einfach. Sie sollten die Dokumentation mindestens einmal durchgehen, um mehr über solche Funktionen zu erfahren.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.