Sonntag, 10. Dezember 2006dynamisches Zip Archiv mit PHP erzeugenHalli hallo, mal wieder! Aus ganz aktuellem Anlass möchte ich euch mal wieder ein kleines Tutorial zukommen lassen. Wer kennt das nicht, man bietet Sachen zum Download an da die Benutzer aber nicht jedes File alleine anklicken wollen (oder manchmal wegen Unfähigkeit auch können) will man Ihnen auch die Möglichkeit geben ausgewählte Dateien dynamisch in ein Zip Archiv zu packen und dann zum Download anzubieten. Also was soll erreicht werden? Die User können vor jedem Dateieintarg eine Checkbox anklicken können, ob sie diese Datei als Zip haben möchten. Dann soll ein Formularbutton gedrückt werden, und alle angeklickten DAteien werden on the fly in ein Zip Archiv gepackt und an den Browser geschickt. Folgende vorbereitungen müssen getroffen werden.
Als 1. erstellen wir uns also das Downloadformular. Dieses soll im wesentlichen nur aus Checkboxen bestehen, die als Inhalt den Pfad zu den Dateien enthält. Diese Daten sollen dan per POST Befehl an das Zip erstellungsskript geschickt werden. Der Quellcode könnte dann wie folgt aussehen ... Diesen Teil müsst Ihr euch leider selbst an eure Gegebenheiten anpassen, ich kann ja schließlich nicht alles machen. :-) Als 2. besorgen wir uns eine Zip Libary, weil wir ja das Rad nicht 3 mal erfinden wollen. Dazu besorgen wir uns einfach PHPMyAdmin darin ist nämlich eine sehr schöne (weil einfache) Zip Libary enthalten. Zu finden ist diese unter \libraries mit dem schönen Namen zip.lib.php. Jetzt kommen wir aber zum spannenden und eigentlich auch sehr simplen Teil. Die Programmierung unseres Ziperstellungs-Skriptes mit PHP. Erst einmal hier den Code, danach die Erklärung dazu. Also als 1. includen wir die libary und erstellen ein neues Zip Objekt. Dann führen wir für jede Datei die per POST als checkbx Variable übermittelt wurde folgendes aus. Wir speichern den Dateinamen incl. Pfad als $filename und ermitteln den Dateinamen an sich und speichern diesen als $clearfilename. Dann lesen wir den Inhalt der Datei aus und speichern es als $content ab. Nun wird die eingelesene Datei mit hilfe von addFile in das Zip Objekt geschrieben, dabei wird der Dateiname $clearfilename verwendet und die Dateierstellungszeit ermittelt. Nachdem alle Dateien aus dem Post eingelesen wurden, wird mit den gesetzten Headern ein Dateidownload beim Browser erzwungen, und mit dem echo befehl und der Methode file() das ganze Ziparchiv gesendet. WarnungDieses Skript ist nur ein Beispiel für die Erstellung eines dynamischen Zip Files. Es ist in dieser Form nicht für den Produktiveinsatz geeignet!!! Vertraut niemals übermittelten Daten (Post und GET). Ihr müsst dringend überprüfen wer was mit dem Skript herunterläd. Sonst läd sich jemand z.B. eure Skripte herunter, und kann den Quelltext betrachten incl. aller Paßwörter ihr darin habt. Ihr solltet sicherstellen, das man mit diesem Skript nur in bestimmten Verzeichnissen etwas packen kann. Sozusagen eine Sandbox einrichtet. Mehr dazu später vielleicht mal. Trackbacks
Trackback für spezifische URI dieses Eintrags
Keine Trackbacks
Kommentare
Ansicht der Kommentare:
(Linear | Verschachtelt)
Hi,
habe das Script für mich einmal etwas modifiziert, sodass ich über die übergebene Variable $vz an die Datei zipdownload.php ein komplettes Verzeichnis in ein Archiv packen kann.
(Verwendet habe ich eine einfache Schleife, die das Verzeichnis ausliest und im Array speichert...).
Da mein Verzeichnis jedoch zu viele Bilder enthielt, bin ich an den Rand des möglichen gestoßen und habe mal ein bisschen gegoogelt und auch eine Lösung gefunden:
ini_set("memory_limit","100M");
am Anfang ergenzen und schon lassen sich auch große Archive im Speicher erstellen.
LG
Die hier dargestellte Möglichkeit, den Browser zum Download-Dialog zu zwingen, in die ZIP-Klasse integriert.
http://blog.philip-ehret.de/2008/08/21/creating-zip-archive-and-offering-its-download/
Wie muss ich das Script umschreiben um die ZIP-File nicht sofort downzuladen, sondern nur auf dem Server zu speichern?
lg
Folgendes sollte gehen, habs aber nicht getestet.
$fp = fopen('ZipFileName.zip', 'w');
fwrite($fp, $zipfile->file());
fclose($fp);
Hoi!
Danke für den kurzen und prägnanten Artikel! Hab exakt diese Funktion gebraucht in einer Rechnungserzeugung - per Klick werden die Rechnungen erzeugt und dann als ZIP zum Download angeboten! Herrlich einfach! :-)
Ciao,
Bastian
Merkwürdig,
hab das original so nachgebaut und teste es mit PDFs: die ausgewählten PDFs liegen zwar im Zip-File, jedoch alle mit 0KB. Die Pfade zu den Files stimmen definitiv. Hat das was mit meinem Mac hier zu tun?
Sehr merkwürdig...
Problem hat sich gelöst: header information stimmte nicht....
immer gut wenn man sich selber helfen kann. Header sind auch echt tricky
Hi
ich hab das gerade nachgebaut und funktioniert auch super. allerdings hab ich dann doch ein kleines Problem.
möchte eine datei Packen, die sehr verschachtelt in einem Unterverzeichnis liegt, die Datei wird irgendwie nicht gepackt.
Kann es sein das hier der Pfad zu lange wird oder das es zuviele unterordner sind?
Kann man das irgendwo anheben?
Gruß Steve
Vielen Dank. Eine einfache Lösung...die nicht so einfach zu finden war!
|
SucheBlog abonnierenKategorienStatistikenLetzter Eintrag: 28.04.2013 17:44
137 Einträge geschrieben
154 Kommentare eingetragen
Verwaltung des BlogsSuchabfragenNaggy |