Dateiupload / -download mit PHP und JavaScript (Ajax)
Man sieht jetzt immer öfter, dass einem angeboten wird, Dateien oder Dokumente (die zum Beispiel in einer Internetanwendung erstellt wurde) runterzuladen, was ja auch ziemlich praktisch sein kann; was aber, wenn man mehrere Dateien runterladen möchte, man müsste für jede einzelne Datei ein Download starten, was lässtig und aufwendig ist, oder was wenn man Dateien runterladen möchte, die aber vom Browser gleich gelesen, bzw. interpretiert werden, zum Beispiel .html, .swf oder .php. Die Lösung ist, diese/s Datei/en oder Dokument/e in ein Archiv zu Packen, und zwar auf dem Server, bzw. in meinem Tutorial auf einem lokalem Server. Bei einem externen Server kann es seien, dass man die FTP-Zugangsdaten angeben muss etc. Damit beschäftigen wir uns aber diesmal nicht.
PHP bietet zwar, zumindest ab der 4 Version eine eigene Zip-Funktion, aber weit aus praktischer und freundlicher ist das Angebot von www.phpconcept.net. Ihr müsst auf deren Seite gehen, und Pcl-Zip runterladen. Auf der Seite wird auch, mehr oder weniger beschrieben wie die einzelnen Funktionen angewendet werden müssen. Allerdings nur auf Französisch und manches auf Englisch. Aber ihr schafft das schon. Ich werde Pcl-Zip hier auch nur soweit erklären wie wir es brauchen werden.
Voraussetzungen sind ein wenig CSS, einfaches DOM, grundlegendes Javascript, PHP und natürlich XMLHTTP-Request; von MySQL sollte man auch schon gehört haben.
Wir werden insgesamt 4 Dateien schreiben, oder scripten oder coden, welcher Begriff auch immer grade am coolsten ist. Als da wäre:
- zipPut.php: Verantwortlich dafür, dass die Dateien, die mittels Get übergeben wurden gezipt werden. Dies passiert in einer Ajax-Anwendung.
- dir00.php: Hier sucht man die Dateien aus, welche gezipt werden sollen, ich verwende dafür simple Checkboxes.
- download.php: Hier kann man dann das Zip-Archiv runterladen, es wird ausserdem noch die Größe und der Inhalt angegeben.
- upload00.php: Hiermit wird die Datei ausgesucht die man hochladen wird und dann auf dem lokalem Server gespeichert. Ich wollte das uhrsprünglich auch mit Ajax machen, aber hatte das Problem, dass für diese Anwendung eine bestimmte Codierung im <form…> notwendig ist, und ich mir nicht sicher bin ob das dann in einer Ajax-Anwendung funktionieren würde.
Ihr werdet an manchen Stellen sehen, dass ich mit Sessions arbeite, aber lasst euch nicht verwirren. Es wird jedesmal die Session neu definiert, das hat den Hintergrund, dass ich das Script an einem „Community-System“ angepasst habe. Das soll heissen, die Session beinhaltet den User-Namen, da ja die Dateien nicht einfach irgendwohin gespeichert werden sollen, sondern in den User entsprechenden Ordner, in dem Falle des Tutorials ist der Username „Exos_Sho“ um mir zu huldigen.
Wir fangen mit dem kleinsten an, dem zipPut00.php. Hier wird auch das Pcl-Zip zum Einsatz kommen. Damit dies funktioniert, muss im selben Verzeichnis, in dem sich die Dateien befnden (werden) die wir schreiben auch das „pclzip.lib.php“ gespeichert sein, da wir darauf ja auch zugreifen werden.
- $arr=„$_GET[‚arr‘];
- session_start();
- $_session[‚user‘]=„Exos_Sho„;
- $user=„$_SESSION[‚user‚];
- $dir=„$user„ . „00„;
- include_once(‚pclzip.lib.php‚);
- $archive=„new„ pclzip($user.‚/‚.$dir.‚.zip‚);
- $v_list=„$archive–„>delete();
- $v_list = $archive->add($arr);
- if ($v_list == 0) {
- die(„Error : „.$archive->errorInfo(true));
- exit();
- }
In der ersten Zeile speichern wir das Array, welches wir über Get bekommen, in $arr. Dann starten wir die Session, und setzen dann die user-Session neu(aus den oben schon erklärten Gründen), um diese dann in $user zu speichern. In der nächsten Zeile erklären wir noch, dass $dir gleich dem Usernamen, mit zwei Nullen hintendrann ist. Das habe ich aus dem Grund gemacht, dass vieleicht manche Leute mehrere Zip-Archive pro User anbieten wollen, dazu müsste man das Ganze zwar mit einer weiteren Get-Variabel und noch mit einer if-Schleife ausstatten, aber das schafft ihr auch selber.
Mit
- include_once(‚pclzip.lib.php‘);
werden die ganzen Funktionen von Pcl-Zip geladen. Mit
- $archive = new PclZip($user.’/‘.$dir.‘.zip‘);
wird ein neues Objekt der Klasse PclZip erstellt(nur das Objekt, nicht das Archiv wird hier erstellt). In den Klammern kommt dann der Username($user), der den Ordner angibt, in den das Archiv gespeichert werden soll, und dann nach dem Slash, kommt der Archiv-Name($dir) und natürlich die Extension „.zip“.In unserem Beispiel würde dass „Exos_Sho/Exos_Sho00.zip“ ergeben. Es wird hierbei davon ausgegangen, dass sich die User-Ordner, im selben Verzeichnis befinden wie die Skripte, die wir schreiben(werden) und auch schon existiert.
In den folgenden zwei Zeilen, wird das Archiv($archive) zunächst gelöscht, da man ja jedesmal das selbe verwenden wird, und nur den Inhalt ändert, dann wird dem Archiv, in der zweiten Zeile, das Array, welches wir über Get bekommen und in $arr abgespeichert haben, übergeben(erst hier wird das Archiv erstellt).
Danach folgt noch eine kleine if-Abfrage, diese bewirkt, dass falls das Archiv nichts beinhaltet, eine Fehlermeldung ausgegeben wird(dies passiert über eine Funktion in pclzip.lib.php) und das Programm abgebrochen wird.
Das wars fürs zipPut.php, um umfangreichere Anwendungen mit Pcl-Zip zu machen, besucht einfach deren Seite, die machen noch andere interessante Sachen.
Jetzt kommt dir00.php, und damit auch der schwerste Teil unserer Anwendung, vor allem im erklären ^^. Hier werden alle Dateien in dem jeweiligen User-Ordner aufgelistet, dabei wird zwischen Videos, Bildern, Musik und Texten unterschieden. Diese differenzierung geschieht über eine ich sage mal „Extension-Selektion“, soll heissen, je nach dem welche Endung die Datei hat(sei es .mp3 oder .png) wird entschieden, wo die Datei hingehört. Ihr könnt dann selber bestimmen welche Dateiformate ihr haben wollt, ich werde euch an entsprechender Stelle bescheid geben. Wie gesagt wählt man die Dateien mit Checkboxen aus, dazu kommt noch, dass man alle Musik-Dateien, Text-Dateien, Bild-Dateien, oder alle Video-Dateien auswählen kann, oder sogar alle Dateien, watnService. Dazu verwenden wir für jeden Dateityp(Video,Text,Musik,Bild) und einmal für alle Dateitypen, abwandlungen einer Funktion die wir hier erstmal durchgehen werden, bevor wir uns dem eigentlichen Script widmen.(ich weiss, ökonomischer wäre es eine einzelne Funktion zu schreiben)
Also hier die Funktion:
- function check(field) {
- if (checkflag == „false„) {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„ID„){
- field[i].checked = true;
- }
- }
- checkflag = „true„;
- return „Uncheck„;
- } else {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„ID„){
- field[i].checked = false;
- }
- }
- checkflag = „false„;
- return „Check„;
- }
- }
dazu kommt noch eine Variabel(checkflag), die in einem Booleanschen Wert speicher, ob alle Checkboxen gecheckt worden sind, oder nicht; die muss übrigens gleich zu Anfang auf „false“ gesetzt werden. Also, diese Funktion wird mit einem Button aufgerufen, und zwar folgender Maßen:
- <input type=button value=„Check„ onClick=„this.value=check(this.form.list)„>
Man wendet hier einen kleinen, aber feinen Trick an, aber zu dem gleich, also der Wert des Button ist zunächst „Check“, was ja eigentlich eine Aufforderung ist, dann kommt eine onClick-Event, also wenn der Button geklickt wird soll was passieren, und zwar wird hier nur angegeben, dass der Wert dieses Buttons geändert werden soll, und zwar mit einer Funktion die(nicht zufällig) den Name der obigen hat. Der Funktion wird zudem noch ein Array übergeben „this.form.list“, das ist ein Array das eine Liste der in dem Formular befindenden Elemente inne hat, und wird mittels DOM ermittelt. Wenn also auf diesen Button gedrückt wird, fordert das onClick-Event an, dass dieser Button den Wert bekommt, den die Funktion check() zurückliefert. Lasst uns jetzt die Funktion durchgehen, sie besteht im Groben aus einem einzelnen if-else Satz. Wenn checkflag gleich „false“ ist, setze alle Checkboxen, deren id gleich „ID“ (wird später entweder Musik, Bild, Video oder Text sein) auf „true“ und gebe „Uncheck“ zurück(der Wert den dann der Button bekommen wird), wenn checkflag gleich „true“ ist, setze alle Checkboxen, deren id gleich ID ist auf „false“ und gebe „Check“ zurück. Ich werde nicht auf jede einzelne Zeile eingehen, da sich der Teil, nach mehreren Malen des Lesens leicht nachvollziehen lässt. Es wird für jedes Dateiformat eine solche Funktion, und entsprechende checkflag-Variabel geben, natürlich werden die auch unterschiedlich heissen. Nun lasst uns anfangen.
- var url = „zipPut00.php?arr=„;
- var checkflag = „false„;
- var checkVideosflag = „false„;
- var checkPicsflag = „false„;
- var checkTextsflag = „false„;
- var checkMusicsflag = „false„;
- var files = [];
Erst definieren wir ein par Variabeln. url verweist auf zipPut00.php, die wir oben schon geschrieben haben, dazu wird ein „?arr=“ angehängt, damit übermittelt man Variabeln, bzw Arrays. In diesem Fall, sind es die Dateien die gecheckt wurden. Dan kommt ein checkflag, dieses verwenden wir um alle oder keine Checkboxen auszuwählen, es folgen dann vier weitere Versionen von checkflag, für je ein Dateiformat. Mit „var files =[];“ wird ganz einfach ein neues Array erstellt, mit dem Namen files.
Jetzt kommt eine Funktion, die dafür Verantwortlich ist, dass das Array files alle Dateien enthält, die man gecheckt hat.
- function checkBig(field){ var num = files.length;
- for(j=0; j<num; j++){
- files.pop();
- }
- for(i=0; i<field.length; i++){
- if(field[i].checked==true){
- files.push(field[i].value);
- }
- }
- updateZip();
- return „Big Checked„;
- }
Diese Fuktion wird ebenfals mit einem Button aufgerufen, und ihr wird abei auch „this.form.list“ übergeben. Zu erst zählt sie die Länge des Arrays files, und speichert die Zahl in der Variabel num. Dann wird durch einen for-Loop jedes mal der erste Eintrag des Arrays gelöscht; somit wird das Array jedesmal erst geleert bevor wieder was reingestopft wird. Dann kommt noch ein for-Loop der, in Abhängigkeit der Länge des ihm übergebenden Arrays das jeweilige Element der übergebende Liste, in das zuvor geleerte Array files steckt, falls checked „true“ ist. Dann wird eine weitere Funktion aufgerufen, die dann letztendlich die Daten an zipPut00.php übergibt.
Jetzt folgen fünf Funktionen, die sich sehr ähneln, es sind die besagten check-Funktionen.
- // function check(field)
- function check(field) {
- if (checkflag == „false„) {
- for (i = 0; i < field.length; i++) {
- field[i].checked = true;
- }
- checkflag = „true„;
- return „Uncheck all„; }
- else {
- for (i = 0; i < field.length; i++) {
- field[i].checked = false;
- }
- checkflag = „false„;
- return „Check all„; }
- }
- // function checkPics(field)
- function checkPics(field) {
- if (checkPicsflag == „false„) {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Pics„){
- field[i].checked = true;
- }
- }
- checkPicsflag = „true„;
- return „Uncheck Pics„; }
- else {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Pics„){
- field[i].checked = false;
- }
- }
- checkPicsflag = „false„;
- return „Check Pics„; }
- }
- // function checkVideos(field)
- function checkVideos(field) {
- if (checkVideosflag == „false„) {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Videos„){
- field[i].checked = true;
- }
- }
- checkVideosflag = „true„;
- return „Uncheck Videos„; }
- else {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Videos„){
- field[i].checked = false;
- }
- }
- checkVideosflag = „false„;
- return „Check Videos„; }
- }
- // function checkTexts(field)
- function checkTexts(field) {
- if (checkTextsflag == „false„) {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Texts„){
- field[i].checked = true;
- }
- }
- checkTextsflag = „true„;
- return „Uncheck Texts„; }
- else {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Texts„){
- field[i].checked = false;
- }
- }
- checkTextsflag = „false„;
- return „Check Texts„; }
- }
- // function checkMusics(field)
- function checkMusics(field) {
- if (checkMusicsflag == „false„) {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Musics„){
- field[i].checked = true;
- }
- }
- checkMusicsflag = „true„;
- return „Uncheck Musics„; }
- else {
- for (i = 0; i < field.length; i++) {
- if(field[i].id==„Musics„){
- field[i].checked = false;
- }
- }
- checkMusicsflag = „false„;
- return „Check Musics„; }
- }
Diese Funktionen muss ich hoffentlich nicht erklären, es sind Abwandlungen der check-Funktion die ich vor geraumer Zeit erklärt habe, fals ihr euch fragt, wo id definiert wird, muss ich euch um Geduld bitten, das kommt noch. Für die zwei nächsten und letzten Funktionen, wäre es praktisch mein anderes Tutorial gelesen zu haben, das sich mit XMLHttp-Requests beschäftigt. Weiter im Text…
- function updateZip() {
- http.open(„GET„, url + escape(files), true)
- http.send(null);
- }
Hier wird mittels XMLHttp-Request das Array files an zipPut00.php übergeben. Und hier noch der Rest :
- function getHTTPObject() {
- var xmlhttp;
- /*@cc_on
- @if (@_jscript_version >= 5) try {
- xmlhttp = new ActiveXObject(„Msxml2.XMLHTTP“);
- } catch (e) {
- try {
- xmlhttp = new ActiveXObject(„Microsoft.XMLHTTP“);
- } catch (E){
- xmlhttp = false;
- }
- } @else xmlhttp = false; @end @*/
- if (!xmlhttp && typeof XMLHttpRequest != ‚undefined‚) {
- try { xmlhttp = new XMLHttpRequest();
- } catch (e) {
- xmlhttp = false;
- }
- }
- return xmlhttp;
- }
- var http = getHTTPObject();
Hierzu werde ich nichts sagen. Das ganze kommt in den <head>-Teil, ein geschlossen in ein <script type=“text/javascript“></script> in dir00.php. Jetzt kommt der <body>, auch hier gibt es ein paar Zeilen die öfter vorkommen, eine Zeile wäre:
- <input type=button value=„Check all„ onClick=„this.value=check(this.form.list)„><br />
Diese Zeile hab ich vorerst schon erwähnt, die Variation die mit der Wiederholung dieser Zeile kommt, findet man im onClick-Event, und zwar der Name der Funktion, dieser ändert sich,je nachdem welches Dateiformat gerade dran ist. Dann wird noch ein ganzer Zeilen-Block(php) wiederholt, wieder mal liegt das an den verschiedenen Dateiformaten.
- $dir=‚./‚.$user.‚/Pics‚;
- $handle=opendir ($dir);
- echo „Dateien:n„;
- echo („<table><tr>„);
- while (false !== ($file = readdir ($handle))) {
- if($file != „.„ && $file != „..„ && $file!= „Thumbs.db„){
- echo „<tr><td><input type=checkbox name=list id=Pics value=$dir/$file></td><td>$filen</td></tr>„;
- }
- }
- echo ‚<input type=button value=“Check Pics“ onClick=“this.value=checkPics(this.form.list)“><br/>‚;
- echo („</tr></table>„);
Zunächst wird hier festgelegt, dass $dir gleich dem Orden Pics aus dem entsprechenden User-Ordner ist. Mit der nächsten Zeile wird $handle gleich der Php-Funktion opendir($dir) gesetzt. Dann wird das ganze, eingeschlossen in einer Tabelle, mittels eines while-/ und if-Loops geprüft(„.“ und „..“ stellen die über Ordner da, und Thumbs.db entsteht in einem Ordner wenn man Miniaturansicht, als Ansicht auf Windows ausgewählt hat.) Fällt die Prüfung positiv aus wird eine neue Checkbox erstellt deren id gleich „Pics“ ist.
- <form name=form action=““ method=post>
- echo ‚<input type=button value=“Check all“ onClick=“this.value=check(this.form.list)“><br/>‚;
- $dir=‚./‚.$user.‚/Pics‚;
- $handle=opendir ($dir);
- echo „Dateien:n„;
- echo („<table><tr>„);
- while (false !== ($file = readdir ($handle))) {
- if($file != „.„ && $file != „..„ && $file!= „Thumbs.db„){
- echo „<tr><td><input type=checkbox name=list id=Pics value=$dir/$file></td><td>$filen</td></tr>„;
- }
- }
- echo ‚<input type=button value=“Check Pics“ onClick=“this.value=checkPics(this.form.list)“><br/>‚;
- echo („</tr></table>„);
- //
- $dir=‚./‚.$user.‚/Videos‚;
- $handle=opendir ($dir);
- echo „Dateien:n„;
- echo („<table><tr>„);
- while (false !== ($file = readdir ($handle))) {
- if($file !== „.„ && $file !== „..„ && $file!= „Thumbs.db„){
- echo „<tr><td><input type=checkbox name=list id=Videos value=$dir/$file></td><td>$filen</td></tr>„;
- }
- }
- echo ‚<input type=button value=“Check Videos“ onClick=“this.value=checkVideos(this.form.list)“><br/>‚;
- echo („</tr></table>„);
- //
- $dir=‚./‚.$user.‚/Texts‚;
- $handle=opendir ($dir);
- echo „Dateien:n„;
- echo („<table><tr>„);
- while (false !== ($file = readdir ($handle))) {
- if($file !== „.„ && $file !== „..„ && $file!= „Thumbs.db„){
- echo „<tr><td><input type=checkbox name=list id=Texts value=$dir/$file></td><td>$filen</td></tr>„;
- }
- }
- echo ‚<input type=button value=“Check Texts“ onClick=“this.value=checkTexts(this.form.list)“><br/>‚;
- echo („</tr></table>„);
- //
- $dir=‚./‚.$user.‚/Musics‚;
- $handle=opendir ($dir);
- echo „Dateien:n„;
- echo („<table><tr>„);
- while (false !== ($file = readdir ($handle))) {
- if($file !== „.„ && $file !== „..„ && $file!= „Thumbs.db„){
- echo „<tr><td><input type=checkbox name=list id=Musics value=$dir/$file></td><td>$filen</td></tr>„;
- }
- }
- echo ‚<input type=button value=“Check Musics“ onClick=“this.value=checkMusics(this.form.list)“><br/>‚;
- echo („</tr></table>„);
Ein ganzer Haufen, zuletzt kommen jetzt noch 3 Zeilen:
- echo ‚<input type=button value=“Big Check“ onClick=“this.value=checkBig(this.form.list)“><br/>‘;
- echo ‚</form>‘;
- closedir($handle);
Das einzig neue hier ist die letzte Zeile, hiermit wird das Verzeichnis wieder geschlossen. Das wars mit dir00.php jetzt kommt upload00.php, hier werden die Dateien hochgeladen, zuersteinmal der Javascript-Teil im <head>
- function send(){
- if(confirm(„Eintragen??„)){
- document.f.ak.value = „ho„
- }else{
- return;
- }
- document.f.submit();
- }
Wenn die Funktion aufgerufen wird, wird zunächst gefragt ob die Datei eingetragen werden soll, fals ja, wird der Wert des hidden-Inputs auf ho gesetzt. Das passiert aber erst wenn die Seite neu geladen wird, da das ganze ja in einem <form> passiert, warum ich das so umständlich mache habe ich am Anfang schon erklärt, ich werde an einer dynamischeren Version arbeiten. Jetzt kommt der erste <body>-Teil:
- session_start();
- $_SESSION[‚user‚]=„Exos_Sho„;
- $user = $_SESSION[‚user‚];
- if($ak ==„ho„){
- $dname = explode(„.„,$upload_name);
- $dnamesize = count($dname);
- $upload_ext = $dname[$dnamesize–1];
- echo „Datatype: „ . $upload_ext;
- if($upload_size>0 && ($upload_ext==„gif„ || $upload_ext==„jpg„ || $upload_ext==„jpeg„ || $upload_ext==„bmp„ || $upload_ext==„png„)){
- copy($upload,$user . „/Pics/„ . $upload_name);
- echo „ Datei gespeichert „;
- }else if($upload_size>0 && ($upload_ext==„mp3„ || $upload_ext==„wav„)){
- copy($upload,$user . „/Musics/„ . $upload_name);
- echo „ Datei gespeichert „;
- }else if($upload_size>0 && ($upload_ext==„txt„ || $upload_ext==„rtf„ || $upload_ext==„doc„)){
- copy($upload,$user . „/Texts/„ . $upload_name);
- echo „ Datei gespeichert „;
- }else if($upload_size>0 && ($upload_ext==„wmv„ || $upload_ext==„div„)){
- copy($upload,$user . „/Videos/„ . $upload_name);
- echo „ Datei gespeichert „;
- }else{
- echo „ Kopierfehler „;
- exit();
- }
- echo „ Fertig „;
- }
In der <form> gibt es ein file-Input, dessen Name ist „upload“, dieser wird dann an das selbe Script übergeben, und landet hier oben. Wenn du nun auf den Namen oder die Größe von upload zugreifen willst, musst du nur zB „_name“ an upload hängen, und das in einer Variabel speichern, wie geschehen in der ersten Zeile, diesen Service bietet Php von Haus aus. In der if-Abfrage:
- $dname = explode(„.“,$upload_name);
allerdings gibt es ein kleines Problem, nur mit „$upload_name“ würde zwar der Name übergebn werden, aller dings mit Extension, also zB. „dateiname.txt“, deswegen wird der Name bei jedem Punkt(.) geteilt und in ein Array gespeichert, $dname sieht also so aus: [„dateiname“,“txt“] .
In den folgenden 2 Zeilen wird dann die Extension ermittelt, mit
- $dnamesize = count($dname);
wird die Anzahl der Elemente im Array($dname) ermittelt, also in unserem Beispiel 2. Mit
- $upload_ext = $dname[$dnamesize-1];
wird dann die Extension in $upload_ext gespeichert, in dem das letzte Element des Arrays($dname) ermittelt wird. Jetzt kommen wieder ein paar Zeilen die in bestimmten Variationen vorkommen werden(in eben diesen Teilen, müsst ihr reinschreiben, welche Extensions ihr akzeptiert), im Grunde sehen sie alle so aus:
- if($upload_size>0 && ($upload_ext==“gif“ || $upload_ext==“jpg“ || $upload_ext==“jpeg“ || $upload_ext==“bmp“ || $upload_ext==“png“)){
- copy($upload,$user . „/Pics/“ . $upload_name);
- echo “ Datei gespeichert „;
- }
Zu erst wird geprüft ob überhaupt eine Datei übergeben wurde, dann testet man die Extension, in diesem Fall prüfe ich ob es Bilder sind, trifft das alles zu, wird die Datei kopiert; dies geschieht mit copy(Datei, Neuer Name), als Datei nehmen wir natürlich die übergebene Datei($upload), als Neuen Namen, nehmen wir erstmal den entsprechenden User-Namen, als Ordner, dann kommt in diesem Falle „/Pics/“, da es sich hier ja um Bilder handelt, und dann noch den Namen der Datei, in unserem Beispiel „dateiname.txt“, im ganzen macht das dann „Exos_Sho/Pics/dateiname.txt“.
Jetzt kommt noch das <form> und wir sind fertig mit upload00.php.
- <form action=„upload00.php„ method=„post„ enctype=„multipart/form-data„ name=„f„>
- <input type=„hidden„ name=„ak„ />
- <input type=„file„ name=„upload„ /><a href=‘javascript:send();‘>Speichern?</a>
- </form>
Sollte eigentlich alles klar sein, wichtig ist das als enctype „multipart/form-data“ angegeben wird, da sonst keine Datei weitergeleitet wird sondern nur der Name. Hier liegt auch das Problem, mit der Dynamik, da ich noch nicht rausgefunden habe wie ich das mit Javascript machen kann.
Wie auch immer, jetzt kommt download00.php, hier wird einerseits die größe des Archivs, sowie auch der Inhalt, also die einzelnen Dateien ausgegeben, und natürlich noch der Download dieses Archivs angeboten. Die alles in wenigen Php-Zeilen:
- include_once(‚pclzip.lib.php‚);
- session_start();
- $_SESSION[‚name‚] = „Exos_Sho„;
- $name = $_SESSION[‚name‚];
- echo („<div>„);
- $zip = new PclZip($name . „/„ . $name . „00.zip„);
- echo filesize($name . „/„ . $name . „00.zip„) . „ bytes <br><br>„;
- if (($list = $zip->listContent()) == 0) {
- die(„Error : „.$zip->errorInfo(true));
- }
- for ($i=0; $i<sizeof($list); $i++) {
- echo $list[$i][„filename„].„<br>„;
- echo „<br>„;
- }
- echo „<a href=‘„.$name.„/„.$name.„00.zip‘>Download <font color=’#2b5168′>„.$name.„00</font></a>„;
- echo („</div>„);
Zunächst muss pclzip.lib.php wieder includet werden, und die Session muss auch aufgenommen werden. Mit der Zeile
- $zip = new PclZip($name . „/“ . $name . „00.zip“);
wird kein neues Archiv erstellt, wie schon am Anfang gesagt, es wird nur das Archiv in $zip gespeichert, warum dann das „new PclZip…..“ das ist notwendig, damit klar ist, dass es ein .zip-Archiv ist, damit die weiteren Funktionen auch funktionieren, ja aus pclzip.lib.php stammen. In der darauffolgenden Zeile wird die Größe des Archivs in bytes ausgegeben, und dann mittels eines for-Loops der Inhalt(die Dateien) aufgelistet.
So, das solls dann auch gewesen sein, viel Spass, und verzeiht meine chaotische Schreibweise.