Zippen mit PHP

Wichtig: vom 6. August 2004 (!). Aufgrund großer Nachfrage, vorallem aus dem JEX-Treme Forum ist er nun nochmals für euch online zu finden.

Einführung

Wer wollte nicht auch schon einmal mit zippen? Selbst wenn es nur kleine Textdateien sind! In diesem Tutorials wird es erklärt!

Auf geht’s

Als erstes Laden wir uns einmal die Ziplib herunter. Die gibt es direkt hier (bzw. weiter unten im Anhang). Nun entpacken wir die Datei. Aus den entpackten Dateien brauchen wir eigentlich nur die Datei “zip.lib.”.

Zipdatei erstellen

Wir erstellen als erstes mal eine Datei namens “zippen.”. In diese Datei schreiben wir dann als erstes:

1
2
3
<?php
ob_start();
?>

Die 1. Zeile müsste jedem klar sein: Damit öffnet man den -Code. ob_start() buffert die Ausgabe, sodass keine Fehlermeldung wie “header is already sendet…” entsteht.

1
2
3
<?php
require("./zip.lib.php");
?>

Mit require() kann man wie mit include() irgendetwas includen. In diesem Fall includen wir die Zip.lib-Class. Der Pfad zur Datei muss lediglich angepasst werden.

1
2
3
<?php
$zipfile = new zipfile("archive.zip");
?>

Nun generieren wir mit hilfe der zip.lib-class eine Zipdatei. “archiv.zip” ist in diesem Fall der Name der Zipdatei.

Den kompletten Inhalt eine Verzeichnisses hinzufügen

Wenn man jetzt den kompletten Inhalt eines Verzeichnisses in die Zipdatei packen möchte, muss man folgenden Befehl anwenden:

1
2
3
<?php
$zipfile->addDirContent("./");
?>

Dieser Befehl packt das komplette Verzeichnis “./” in die Zipdatei. Man könnte auch schreiben:

1
2
3
<?php
$zipfile->addDirContent("./test");
?>

Dieser Code packt das Verzeichnis “/test” in die Zipdatei.

Einzelne Dateien hinzufügen

Du brauchst nicht immer das komplette Verzeichnis hinzufügen, nein, auch einzelne Dateien funktionieren:

1
2
3
<?php
$zipfile->addFileAndRead("haus.jpg");
?>

Dieser Befehl fügt die Datei “haus.jpg” in die Zipdatei ein.

Wenn die Datei allerdings im Verzeichnis “bilder” ist, muss es heißen:

1
2
3
<?php
$zipfile->addFileAndRead("bilder/haus.jpg");
?>

Eine neu erstellte Datei hinzufügen

Wenn du einen Text z.B. in der Variable $text hast, kannst du auch diesen Text in eine Datei packen.

Das sieht dann ungefähr so aus:

1
2
3
4
<?php
$text="Dies ist ein Text, der in das Ziparchiv soll.";
$zipfile->addFile(, 'Text.txt');
?>

Jetzt wird eine neue Datei, mit dem Dateinamen “Text.txt”, und dem Inhalt der Variable “$text” in das Archiv eingefügt.

Datei ausgeben

Zuletzt muss die Datei nur noch ausgegeben werden.
Das erledigt der Befehl $zipfile->file();:

1
2
3
<?php
echo $zipfile->file();
?>

Beispiel

Hier noch ein Beispiel, für die, die es noch nicht verstanden haben, wie das jetzt genau geht:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.
ob_start();
 
// Läd die Zip-Library
require("./zip.lib.php");
 
// Erstellt eine neue Zipdatei
$zipfile = new zipfile("archive.zip");
 
// Fügt den kompletten Inhalt des Verzeichnisses "/" in die Zipdatei ein.
$zipfile->addDirContent("./");
 
// Fügt die Datei "haus.jpg" des Verzeichnisses "bilder" in die Zipdatei ein.
$zipfile->addFileAndRead('bilder/haus.jpg');
 
// Gibt die Zip-Datei aus.
echo $zipfile->file();
?>

Achtung

Leider lässt sich das generierte Zipfile nicht mit dem intigrierten Packer von Windows XP öffnen. Benutze stattdessen lieber Winrar.

Schlusswort

Hier endet dann mein erster selbstgeschriebener . Ich hoffe ihr konntet mir folgen und habt “hinterher” genausoviel Spass beim Ausprobieren wie ich beim Schreiben. Solltet ihr trotzdem noch Fragen haben, dann meldet euch bei mir schreibt in die Kommentare.

13 Reaktionen zu “Zippen mit PHP”

Pingbacks

  1. Codeschnipselsektion mit einem Tutorial eröffnet in Codeschnipsel | FrankyOnline.de
  2. Alternative ZIP Library f

Kommentare

  1. Franky sagt:

    Test.. so einfach kann man auch auf statischen Seiten Kommentare schreiben? :-O

  2. asdf sagt:

    warum kann man die zip-datei nicht mit dem packer von win xp öffnen?

  3. Webpacker sagt:

    Geniales Tutorial. Hat mir sehr geholfen. Soweit hat auch alles geklappt, nur gibts da ein Problem. Wie kann ich die fertige zip-Datei direkt auf den Webserver speichern? Würd mich sehr über eine Antwort freuen - Merci - Andi

  4. Franky sagt:

    Am einfachsten via file_put_contents(’zipdate.zip’, $zipfile->file()); ganz zum schluss ;-)

  5. Webpacker sagt:

    Danke für die schnelle Antwort. Hat wie erwartet perfekt funktioniert :-)
    Jetzt möchte ich aber unterbinden, dass die Datei zum Download angeboten wird. Dachte eigentlich, dass das mit dem entfernen der header in der zip.lib zu machen sei. Es wird aber immernoch ein Download angeboten. Nochmals danke und hoffentlich bis bald - Andi

  6. boysetsfire sagt:

    Moin,
    geniales Script!! top! :) Allerdings lässt das Script die ganze “Ordner” aus und zippt nur “Dateien”. Obwohl im Script ja “rekursiv” steht.
    Gibt’s da noch nen Trick?

    greetz boysetsfire

  7. hmmm sagt:

    Schönes Skript, allerdings zippt es nur Dateien in ./, hab spaßeshalber sogar mal nen Ordner test angelegt und die zip bleibt trotzdem leer. test und ./ hatten dieselben Rechte, weiß jemand weiter?
    Danke im Voraus!

  8. Marty sagt:

    Die Lösung für das Problem mit den Ordnern ist simpel. Es wird die Classe DeepDir.php benötigt (http://www.phpclasses.org/browse/file/3605.html). Die muss dann noch in zip.lib.php eingebunden werden (Zeile 12, dort bei $DeepDir den relativen Pfad zu DeepDir.php angeben - relativ von der php-Datei die php.lib.php includet). Thats it, hätte hier in diesem Tutorial dringend erwähnt gehört.

  9. Philipp sagt:

    Hi,

    gibt es für das Problem, dass die Zip-Dateien nicht mit dem Windows-Packer geöffnet werden können, eine Lösung oder evtl. ein anderes Script?

    Ich benutze selbst schon lange so etwas wie das obige Beispiel, bekomme aber ständig Mails von Besuchern, dass sie die Datei nicht öffnen können. Es steht zwar auch mit dabei, dass man 7Zip o.ä. benötigt, aber was Usability angeht, ist das natürlich nicht so schön, und nicht jeder will sich extra noch ein Packprogramm installieren.

  10. ass sagt:

    Wie webpacker am 8.9.2009 schon fragte: “Jetzt möchte ich aber unterbinden, dass die Datei zum Download angeboten wird.” Auch mein Problem! Werhatesgelöst?

  11. GDur sagt:

    Echt gute erklärung…
    Hat mir sehr geholfen..so muss das immer sein

Kommentar schreiben

  1. (Pflicht)
  2. (Pflicht)
  3. (Pflicht)
  4. Senden als..
 

cforms contact form by delicious:days