Halli 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.
- Formular erstellen
- Zip Libary besorgen
- Zip erstellungsfile schreiben.
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.
Warnung
Dieses 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.