<?php //Copyright 2004 Tai Gerstberger // This file is part of PiwiP (PiwiP isn't written in PHP). // PiwiP is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // PiwiP is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with PiwiP; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //Thanks for great ideas and great help to TOBIAS THALMEIER (http://tt-home.de). //ACHTUNG: DER BILDSERVER MUSS DIRECTORY LISTING AKTIVIERT HABEN (D.H. BEI AUFRUF //VON EXAMPLE.COM/USER27/GALLERY/ MUSS VOM BILDSERVER EINE AUTOMATISCH ERZEUGTE //HTML-DATEI, DIE DEN INHALT (VERZEICHNISSE UND (BILD-)DATEIEN) ZEIGT, AUSGEGEBEN //WERDEN), SONST KOENNEN DIE VERZEICHNISSE NICHT AUSGELESEN WERDEN //ACHTUNG: ES DUERFEN KEINE DATEIEN MIT NAMEN INDEX.HTML INNERHALB DER //BILDSERVER(UNTER)VERZEICHNISSE SEIN (EXAMPLE.COM/USER27/INDEX.HTML IST MOEGLICH, //EXAMPLE.COM/USER27/GALLERY/INDEX.HTML DARF NICHT SEIN, //EXAMPLE.COM/USER27/GALLERY/HOLIDAYS/EASTERN/INDEX.HTML DARF AUCH NICHT SEIN) !!! //Achtung: es kommt oefter der Begriff "directory listing" zu Gebrauch, in //folgenden Zusammenhaengen ist die vom Bildserver ausgegebene html-Seite (die //alle Verzeichnisnamen und/oder Bildnamen enthaelt) gemeint !!! //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //$initialurl MUSS ANGEPASST WERDEN, DIESE VARIABLE IST IN PIWIP.CONF ZU FINDEN! //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //in der Datei piwip.conf werden die Einstellungen vorgenommen include ("./include/piwip.conf"); #echo "<br>\$initialurl: ".$initialurl."\n"; #echo "<br>\$includepath: ".$includepath."\n"; #echo "<br>\$backgroundcolor: ".$backgroundcolor."\n"; //wenn $htmltitle einem Verzeichnisnamen entspricht, so ist diese Variable zu //diesem Zeitpunkt noch nicht gesetzt #echo "<br>\$htmltitle: ".$htmltitle."\n"; //wenn $tabletitle einem Verzeichnisnamen entspricht, so ist diese Variable zu //diesem Zeitpunkt noch nicht gesetzt #echo "<br>\$tabletitle: ".$tabletitle."\n"; #echo "<br>\$tabletitlealternative: ".$tabletitlealternative."\n"; //Ausgabe einer Fehlermeldung mit Apache 2 sobald $subdir leer (nicht gesetzt) //ist; es wird geprueft, ob $subdir gesetzt ist und wenn nicht, wird $subdir mit //einem leeren Wert belegt if (isset($subdir)) { //nichts machen } else { $subdir = ""; } //folgende Zeile auskommentieren, um zu sehen welches Unterverzeichnis übergeben //wurde (wenn überhaupt eines übergeben wurde): #echo "<br>\$subdir: ".$subdir."\n"; //folgender Abschnitt (bis ksort($replace_with_rfc1738);) legt die Variablen //fest, damit Zeichen, die nach RFC 1738 kodiert sind, zu den entsprechenden //Sonderzeichen (und andersherum) verwandelt werden können //Gibt eine Zeichenkette zurück, in der die nach RFC 1738 kodierten Zeichen //(Prozent-Zeichen (%), gefolgt von einer 2-stelligen hexadezimalen Zahl) in //Sonderzeichen (Leerzeichen, Ae, ae, Oe, oe, Ue, ue und Scharfes S) ersetzt //worden sind. Die Kodierung nach RFC 1738 dient zum Schutz von Zeichen, die //als spezielle URL-Zeichen zu interpretieren sind. $search_rfc1738[0] = "/%20/"; $search_rfc1738[1] = "/%C4/"; $search_rfc1738[2] = "/%E4/"; $search_rfc1738[3] = "/%D6/"; $search_rfc1738[4] = "/%F6/"; $search_rfc1738[5] = "/%DC/"; $search_rfc1738[6] = "/%FC/"; $search_rfc1738[7] = "/%DF/"; $replace_with_specialcharacter[0] = " "; $replace_with_specialcharacter[1] = "Ä"; $replace_with_specialcharacter[2] = "ä"; $replace_with_specialcharacter[3] = "Ö"; $replace_with_specialcharacter[4] = "ö"; $replace_with_specialcharacter[5] = "Ü"; $replace_with_specialcharacter[6] = "ü"; $replace_with_specialcharacter[7] = "ß"; ksort($search_rfc1738); ksort($replace_with_specialcharacter); //Gibt eine Zeichenkette zurück, in der die Sonderzeichen (Leerzeichen, Ae, //ae, Oe, oe, Ue, ue und Scharfes S) durch ein Prozent-Zeichen (%), gefolgt //von einer 2-stelligen hexadezimalen Zahl, ersetzt worden sind. Dies ist //die Kodierung nach RFC 1738 zum Schutz von Zeichen, die als spezielle //URL-Zeichen zu interpretieren sind. $search_specialcharacter[0] = "/ /"; $search_specialcharacter[1] = "/Ä/"; $search_specialcharacter[2] = "/ä/"; $search_specialcharacter[3] = "/Ö/"; $search_specialcharacter[4] = "/ö/"; $search_specialcharacter[5] = "/Ü/"; $search_specialcharacter[6] = "/ü/"; $search_specialcharacter[7] = "/ß/"; $replace_with_rfc1738[0] = "%20"; $replace_with_rfc1738[1] = "%C4"; $replace_with_rfc1738[2] = "%E4"; $replace_with_rfc1738[3] = "%D6"; $replace_with_rfc1738[4] = "%F6"; $replace_with_rfc1738[5] = "%DC"; $replace_with_rfc1738[6] = "%FC"; $replace_with_rfc1738[7] = "%DF"; ksort($search_specialcharacter); ksort($replace_with_rfc1738); //folgender Abschnitt (bis #echo "<br>\$subdir (korrigiert mit /): ".$subdir."\n";) //prueft, ob bei einem uebergebenem Unterverzeichnis ($subdir) der Schraeg- //strich (Zeichen /) hinter dem Unterverzeichnis fehlt; wenn ja wird der //Schraegstrich ergaenzt $pattern1_subdir = "|\/$|isU"; $test1_subdir = preg_match_all($pattern1_subdir, $subdir, $hit1_subdir); $pattern2_subdir = "|.*?|isU"; $test2_subdir = preg_match_all($pattern2_subdir, $subdir, $hit2_subdir); //zu Testzwecken auskommentieren, um die Treffer zu sehen ($hit1_subdir[0][0] //ist bei Treffer ein Schraegstrich (Zeichen /), $hit2_subdir[0][0] ist bei //Treffer der Name des Unterverzeichnisses (falls ein Schraegstrich vorhanden //ist, wird dieser mit angezeigt)) #echo "<br>\$hit1_subdir[0][0]: ".$hit1_subdir[0][0]."\n"; #echo "<br>\$hit2_subdir[0][0]: ".$hit2_subdir[0][0]."\n"; $subdir = preg_replace($search_rfc1738, $replace_with_specialcharacter, $subdir); $shownsubdir = $subdir; $subdir = preg_replace($search_specialcharacter, $replace_with_rfc1738, $subdir); if ($hit1_subdir[0][0]=="/") { //nichts machen, der benötigte Schraegstrich (Zeichen /) ist hinter dem //Unterverzeichnis ($subdir) vorhanden } else { if ($hit2_subdir[0][0]=="") { //nichts machen, da $subdir leer ist (d.h. es wurde kein //Unterverzeichnis uebergeben) } else { //es wurde ein Unterverzeichnis ($subdir) uebergeben, aber es fehlt //der Schraegstrich (Zeichen /) hinter dem Unterverzeichnis $subdir = $subdir."/"; } } //zu Testzwecken auskommentieren, um zu sehen ob $subdir nun korrekt (d.h. //mit Schraegstrich am Ende) dargestellt wird: #echo "<br>\$subdir (korrigiert mit /): ".$subdir."\n"; $url = $initialurl; //$initalurl stammt aus piwip.conf $url = $url.$subdir; //zu Testzwecken auskommentieren, um $url zu pruefen #echo "<br>\$url: ".$url."\n"; //herausloesen des hintersten Verzeichnisses aus der url (im Beispiel //http://www.example.com/Gallery/Holidays/Eastern/ ist dies "Eastern"): $pattern_url = "/(\/)([^\/]+[^\/])(\/$)/isU"; preg_match_all($pattern_url, $url, $hit_url); //zu Testzwecken auskommentieren, um die Treffer zu sehen: #echo "<br>\$hit_url[0][0]: ".$hit_url[0][0]."\n"; #echo "<br>\$hit_url[1][0]: ".$hit_url[1][0]."\n"; #echo "<br>\$hit_url[2][0]: ".$hit_url[2][0]."\n"; #echo "<br>\$hit_url[3][0]: ".$hit_url[3][0]."\n"; //$gallerydirectory ist das hinterste Verzeichnis aus $url $gallerydirectory = $hit_url[2][0]; $gallerydirectory = preg_replace($search_rfc1738, $replace_with_specialcharacter, $gallerydirectory); //$showngallerydirectory wird zur Anzeige in der "Uebersichts"tabelle benoetigt $showngallerydirectory = $gallerydirectory; $gallerydirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $gallerydirectory); $url = preg_replace($search_specialcharacter, $replace_with_rfc1738, $url); //sofern lokal ein Webserver (z.B. Apache) laeuft, kann zu Testzwecken eine //lokale Kopie des ausgegebenen directory listing des Bildservers gespeichert //werden (im Browser die Seite des Bildservers aufrufen (z.B. //http://www.example.com/Gallery/) und die ausgegebene Seite lokal als //IndexBildserver.html speichern [unter SuSE Linux 8.2 Professional z.B. // /srv/www/htdocs/test/IndexBildserver.htm]); //zu Testzwecken koennen folgende Zeilen auskommentiert werden: #$url = "http://localhost/test/IndexBildserver.html"; #$gallerydirectory = "Gallery"; #echo "<br>\$url: ".$url."\n"; #echo "<br>\$subdir: ".$subdir."\n"; #echo "<br>\$gallerydirectory: ".$gallerydirectory."\n"; //piwip.conf muss erneut eingelesen werden, wenn fuer den html-Titel und/oder //Tabellentitel die Variable $showngallerydirectory gesetzt ist include ($includepath."piwip.conf"); //Einfuegen des HTML-Headers include ($includepath."html_header.inc"); //Einfuegen der Logos include ($includepath."logos.inc"); //Einfuegen eines Absatzes include ($includepath."break.inc"); //oeffnen einer Verbindung zum Bildserver $fp = fopen ("$url","rb"); if ($fp) { while (!feof($fp)) { //$subject ist der später zu durchsuchende Text (in diesem Fall das vom //Bildserver ausgegebene directory listing) $subject = fread($fp,200000); //$comparedirectory (wird gesetzt nachdem nachfolgende if-Bedingung //abgearbeitet wurde) wird benoetigt, weil der PHP-Server den Inhalt von //$subject eigenmaechtig zerstueckelt hat (zuwenig zugeteilter Arbeits- //speicher???) if ($comparedirectory == $gallerydirectory) { //nichts machen, der PHP-Server liest gerade den zweiten (oder dritten //oder vierten) Teil eines eigenmaechtig zerstueckelten $subject, //der fuer die Abarbeitung wichtige erste Teil wurde schon gelesen (in //der nun folgenden else-Bedingung) } else { //zu Testzwecken auskommentieren, um $subject anzusehen: #echo "<br>\$subject: ".$subject."\n"; //hier gehts an die regulaeren Ausdruecke (Regular Expressions) //nur zum Verstaendnis in folgenden zwei Zeilen ein Ausschnitt (eine //Zeile) aus dem directory listing: //<img SRC="/icons/image2.gif" ALT="[IMG]"> <a HREF= //"im001382.jpg">im001382.jpg</a> 29-Jun-2004 23:02 37k //der Bildname im001382.jpg wird spaeter aus dem Abschnitt //jpg">im001382.jpg</a> genommen //Festlegung des Suchmusters (pattern_pic), um die Bildnamen (z.B. //im001382.jpg) aus dem directory listing herauszuloesen //(Suchmuster muss bei anders aussehendem directory listing angepasst //werden): $search_pic_before = "(jpg|png|gif|bmp).>"; $search_pic = ".*?\.(jpg|png|gif|bmp)"; $search_pic_after = "<\/a>"; $pattern_pic = "/($search_pic_before)($search_pic)($search_pic_after)/im"; //Festlegung, ob mindestens ein Bild existiert (wenn ja hat $test_pic //den Wert "1"): $test_pic = preg_match($pattern_pic, $subject); //zu Testzwecken auskommentieren, um zu sehen ob mindestens ein Bild //vorhanden ist: #echo "<br>\$test_pic: ".$test_pic."\n"; //Einfuegen des Tabellen-Headers include ($includepath."table_header.inc"); //Pruefung, ob mindestens ein Bild existiert (wenn ja hat $test_pic //den Wert "1") if ($test_pic==0) { //nichts machen } else { //falls das Verzeichnis mindestens ein Bild enthaelt soll dieses //Verzeichnis mit Verlinkung zu den Bildern angezeigt werden //Achtung: es wird bei mindestens einem vorhandenen Bild IMMER zu //"Bilder Hochformat" UND "Bilder Querformat" verlinkt, auch wenn //alle Bilder in nur einem Format sind !!! //Achtung: ein quadratisches Bild wird in der eigentlichen Bilder- //galerie (gallery.php) sowohl bei Hochformat als auch bei Quer- //format angezeigt (siehe dazu Datei "gallery.php") !!! echo "<tr><td>"; echo "<font size=\"+1\"><span style=\"font-weight: bold;\">"; echo $showngallerydirectory; echo "</span></td>"; echo "<td></td>"; echo "<td>"; echo "<a href=\"gallery.php?subdir=".$subdir."&align=portrait\">Bilder Hochformat</a>"; echo "</td>"; echo "<td>"; //align=landscape wird in folgender Zeile nicht benoetigt echo "<a href=\"gallery.php?subdir=".$subdir."\">Bilder Querformat</a>"; echo "</font>"; echo "</td></tr>"; } //regulaere Ausdruecke (Regular Expressions), hier um //(Unter)Verzeichnisse ausfindig zu machen //zum Verstaendnis in folgenden zwei Zeilen ein Ausschnitt (eine //Zeile) aus dem directory listing: //<img src="folder.gif" alt="[DIR]"> <a href= //"20040626/">20040626/</a> 29-Jun-2004 23:09 - <br> //das Verzeichnis 20040626 wird spaeter aus dem Abschnitt // /">20040626/</a> genommen //Festlegung des Suchmusters (pattern), um die Verzeichnisse (z.B. //20040626) aus dem directory listing herauszuloesen (Suchmuster //muss bei anders aussehendem directory listing angepasst werden): $search_dir_before = "\/\">"; $search_dir = ".*?"; $search_dir_after = "\/<\/a>"; $pattern_dir = "/($search_dir_before)($search_dir)($search_dir_after)/imU"; //herausloesen der Verzeichnisse (z.B. 20040626) aus dem directory //listing: preg_match_all($pattern_dir, $subject, $hit_dir); //zu Testzwecken auskommentieren, um die Treffer zu sehen #echo "<br>\$hit_dir[2][0]: ".$hit_dir[2][0]."\n"; #echo "<br>\$hit_dir[2][1]: ".$hit_dir[2][1]."\n"; #echo "<br>\$hit_dir[2][2]: ".$hit_dir[2][2]."\n"; #echo "<br>\$hit_dir[2][3]: ".$hit_dir[2][3]."\n"; //zu Testzwecken auskommentieren, um die Anzahl der gefundenen //Unterverzeichnisse zu sehen: #echo "<br>count(\$hit_dir[0]): ".(count($hit_dir[0]))."\n"; for ($i = 0; $i < count($hit_dir[0]); $i++) { $newdirectory = $hit_dir[2][$i]; $shownnewdirectory = $newdirectory; $newdirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $newdirectory); //zu Testzwecken auskommentieren, damit man sieht ob die richtigen //Verzeichnisnamen gefunden wurden: #echo "<br>\$newdirectory: ".$newdirectory."\n"; #echo "<br>\$shownnewdirectory: ".$shownnewdirectory."\n"; //Ausgabe der eigentlichen Tabelle (1. Spalte; Name des //Unterverzeichnisses) echo "<tr><td>"; echo "<font size=\"+1\"><span style=\"font-weight: bold;\">"; echo $shownnewdirectory; echo "</span></td>"; $urlsubdirectory = $url.$newdirectory; $urlsubdirectory = preg_replace($search_specialcharacter, $replace_with_rfc1738, $urlsubdirectory); //eine lokale Kopie des ausgegebenen directory listing des //Bildservers (zu Testzwecken kann darueberliegende Zeile //kommentiert und dafuer folgende Zeilen auskommentiert werden): #$urlsubdirectory = "http://localhost/test/IndexSubdirectory.htm"; #echo "<br>\$urlsubdirectory: ".$urlsubdirectory."\n"; //oeffnen einer Verbindung zum Unterverzeichnis des Bildservers $fpsubdirectory = fopen ("$urlsubdirectory","r"); if ($fpsubdirectory) { while (!feof($fpsubdirectory)) { //$subjectsubdirectory ist der später zu durchsuchende Text $subjectsubdirectory = fread($fpsubdirectory,200000); //$comparedirectory (wird gesetzt nachdem nachfolgende //if-Bedingung abgearbeitet wurde) wird benoetigt, weil //der PHP-Server den Inhalt von $subjectsubdirectory //eigenmaechtig zerstueckelt hat (zuwenig zugeteilter //Arbeitsspeicher???) if ($comparedirectory == $newdirectory) { //nichts machen, der PHP-Server liest gerade den zweiten //(oder dritten oder vierten) Teil eines eigenmaechtig //zerstueckelten $subjectsubdirectory, der fuer die //Abarbeitung wichtige erste Teil wurde schon gelesen (in //der nun folgenden else-Bedingung) } else { //zu Testzwecken auskommentieren, um $subjectsubdirectory //anzusehen: #echo "<br>\$subjectsubdirectory: ".$subjectsubdirectory."\n"; //erneute Suche, um zu sehen ob das bestimmte Verzeichnis //weitere Unterverzeichnisse hat: //Festlegung, ob mindestens ein Unterverzeichnis existiert //(wenn ja hat $test_dir den Wert "1"): $test_dir = preg_match($pattern_dir, $subjectsubdirectory); //zu Testzwecken auskommentieren, um zu sehen ob mindestens //ein Unterverzeichnis vorhanden ist: #echo "<br>\$test_dir: ".$test_dir."\n"; //Ausgabe der Tabelle (2. Spalte; bei vorhandenen weiteren //Unterverzeichnissen "Verzeichnis ansehen"-Dialog anzeigen) //Pruefung, ob mindestens ein Unterverzeichnis existiert //(wenn ja hat $test_dir den Wert "1") if ($test_dir==0) { echo "<td></td>"; } else { echo $shownsubdir; echo "<td><a href=\"index.php?subdir=".$subdir.$newdirectory."/\">Verzeichnis ansehen</a></td>"; } //Suche um herauszufinden, ob das entsprechende Verzeichnis //Bilder (z.B. im001382.jpg) enthält: //Festlegung, ob mindestens ein Bild existiert (wenn ja //hat $test_pic den Wert "1"): $test_pic = preg_match($pattern_pic, $subjectsubdirectory); //zu Testzwecken auskommentieren, um zu sehen ob mindestens //ein Bild vorhanden ist: #echo "<br>\$test_pic: ".$test_pic."\n"; //Ausgabe der Tabelle (3. und 4. Spalte; bei vorhandenen //Bildern Link zur eigentlichen Galerie [3. Spalte: Galerie //mit Bildern in Hochformat; 4. Spalte: Galerie mit Bildern //in Querformat] anzeigen) if ($test_pic==0) { echo "<td></td><td></td>"; } else { //falls das Verzeichnis mindestens ein Bild enthaelt //soll dieses Verzeichnis mit Verlinkung zu den Bildern //angezeigt werden //Achtung: es wird bei mindestens einem vorhandenen Bild //IMMER zu "Bilder Hochformat" UND "Bilder Querformat" //verlinkt, auch wenn alle Bilder in nur einem Format //sind !!! //Achtung: ein quadratisches Bild wird sowohl bei //Hochformat als auch bei Querformat angezeigt (siehe //Datei "gallery.php") !!! echo "<td>"; echo "<a href=\"gallery.php?subdir=".$subdir.$newdirectory."/&align=portrait\">Bilder Hochformat</a>"; echo "</td>"; echo "<td>"; echo "<a href=\"gallery.php?subdir=".$subdir.$newdirectory."/\">Bilder Querformat</a>"; echo "</td>"; } }//Ende if ($comparedirectory == $newdirectory) $comparedirectory = $newdirectory; }//Ende while (!feof($fpsubdirectory)) fclose($fpsubdirectory); }//Ende if ($fpsubdirectory) }//Ende for ($i=0; $i< count($hit2[0]); $i++) //Einfuegen des Tabellen-Fusses include ($includepath."table_foot.inc"); }//Ende if ($comparedirectory == $gallerydirectory) $comparedirectory = $gallerydirectory; }//Ende while (!feof($fp)) fclose($fp); }//Ende if ($fp) //Einfuegen des HTML-Fusses (meist </body></html>) include ($includepath."html_foot.inc"); ?>