Teil von  SELFPHP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP? In über 120.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Rekursive Verzeichnisauflistung – Bildergalerie, PDFDateien etc.


Systemvoraussetzung

  • Linux
  • Windows
  • PHP 3
  • PHP 4
  • PHP 5

Datei(en)

searchFiles.php, searchFiles.inc.php

Problem

Sie haben ein Verzeichnis mit Unterverzeichnissen und wollen die Dateien in den jeweiligen Verzeichnissen nach Verzeichnisnamen katalogisiert auf Ihrer Website präsentieren. Leider befinden sich in manchen Verzeichnissen Dateiformate (z. B. *.txt, *.php), die Sie ausschließen möchten.

Sie wollen lediglich alle *.jpg und *.gif (z. B. Ihre Urlaubsfotos) auflisten. Vielleicht möchten Sie aber auch nur PDF-Dateien zum Download anbieten oder Ihre selbst erstellten MP3-Dateien.

Da Sie zukunftsorientiert sind und Ihre Website barrierefrei ist, sollte selbstverständlich die Ausgabe valide zu HTML 4.01 und CSS 2 sein. Natürlich erwarten Sie auch, dass Sie nur einzelne Verzeichnisse (also nicht rekursiv) darstellen können.

Es gibt bestimmte Seiten auf Ihrer Website, bei denen Sie als Überschrift der Kategorien den kompletten Verzeichnispfad angeben wollen, auf anderen aber nur das aktuelle Verzeichnis. Sie benötigen weiterhin das jeweilige Datum einer Datei (letzte Aktualisierung) sowie die Dateigröße.

Sie sehen, die Anforderungen steigen mit der Vielzahl der Wünsche, lassen sich aber dennoch programmiertechnisch einwandfrei lösen. In einem späteren Beispiel werden Sie sehen, wie man anstelle der Dateinamen kleine Thumbnails (Vorschaubilder) erstellt.


Lösung

Das nachfolgend beschriebene Programm durchläuft rekursiv (Verzeichnisse und Unterverzeichnisse) alle Verzeichnisse und sucht nach den Dateitypen, die Sie beim Programmstart angegeben haben. Findet es eine Datei, die zum Suchmuster passt, so speichert es den Verzeichnisnamen, den Dateinamen inkl. Pfad, das Datum der letzten Aktualisierung sowie die Dateigröße in einem mehrdimensionalen Array und setzt danach seine Suche fort.

Den größten Erfolg und Nutzen erzielen Sie, wenn Sie bereits im Vorfeld die Verzeichnisnamen und Dateinamen so benennen, das Sie für jedermann einsichtig und verständlich sind. Ziehen wir das Beispiel Urlaubsfotos heran, so könnte eine sinnvolle Lösung folgendermaßen aussehen. Sie haben einen Hauptordner, den Sie Urlaubsfotos oder Bilder nennen.

In diesem Ordner erstellen Sie weitere Unterordner für jedes einzelne Land (z. B. Thailand, Malediven, China). Sie können in diese Unterordner Ihre Bilder ablegen oder noch weitere Unterordner für die einzelnen Städte (z. B. Phuket oder Krabi für Thailand) erstellen. Wenn Sie jetzt noch die Bilder mit aussagekräftigen Namen (z. B. Tauchen.jpg, Hotel.gif, Flughafen.jpg) ausstatten, erhalten Sie durch das Programm eine überaus flexible Lösung, um Ihre Urlaubserinnerungen auf Ihrer Website darzustellen.



Abbildung 7.1: Dateien finden

Beispiel

Das nachfolgend beschriebene Programm besteht aus zwei Dateien, searchFiles. inc.php und searchFiles.php. searchFiles.php enthält den eigentlichen HTML-Bereich mit unseren CSS-Definitionen und inkludiert die Datei searchFiles.inc.php, die den Programmcode mit den drei Funktionen scan_dir(),buildArray() und buildSites() beinhaltet.

Die Datei searchFiles.inc.php erzeugt keinen direkten HTML-Code, sondern liefert Ihnen als Rückgabewert einen aufbereiteten String mit dem Inhalt der Verzeichnisse, sodass Sie die String-Variable in Ihr eventuell bestehendes Templatesystem mühelos integrieren können.

Die zu inkludierende Datei wird folgendermaßen aufgerufen:

72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
<?PHP
include_once("searchFiles.inc.php");
$fileTyp = array("jpg","gif");
$pictures = array();
$Bildergalerie scan_dir("bilder/",$fileTyp,TRUE,FALSE,TRUE,$onlyDir$pictures);
if(
$Bildergalerie == false)
{
    
//echo 'Verzeichnis existiert nicht';
}
else{
    
$ausgabe buildSites($Bildergalerie);
    
//print_r($Bildergalerie);
    
echo $ausgabe;
}

?>

</body>
</html>
Beispiel 7.3: searchFiles.php

Nimmt man dieses Beispiel, so haben Sie jetzt in der String-Variable $ausgabe den Inhalt und können diesen mit echo() ausgeben.

function scan_dir($dir, $type=array(),$only=FALSE, $allFiles=FALSE,
         $recursive= TRUE, $onlyDir="", &$pictures)
   @param   string   $dir
   @param   array   $type
   @param   bool     $only
   @param   bool     $allFiles
   @param   bool     $recursive
   @param   string   $onlyDir
   @param   array   $pictures
   @return   mixed

Die Funktion scan_dir() erwartet als Parameter das Verzeichnis ($dir z. B. „Bilder/“), von dem aus gesucht werden soll, ein Array mit den Dateiendungen ($type – z. B. „jpg,gif“) und die optionalen Parameter $only (TRUE – nur der Verzeichnisname wird angezeigt, ansonsten der komplette Pfad), $allFiles (TRUE – listet alle Dateien auf, egal welche Dateiendung) und $recursive (FALSE – durchsucht nur das angegebene Verzeichnis, nicht die Unterverzeichnisse).

Nach Aufruf von scan_dir() durchläuft die Funktion das aktuelle Verzeichnis (144). Jedes Verzeichnis beginnt mit einem . (Punkt) und einem .. (Punkt Punkt), die auch als „Dateien“ eingelesen werden. Sollte unsere Funktion diese beiden Pseudodateien finden (150), bricht sie den aktuellen Schleifendurchlauf (149) ab und fährt mit der nächsten Datei oder dem nächsten Verzeichnis fort.

Sollten Sie bei der Parameterangabe der Funktion (142) $recursive=FALSE gesetzt haben, so werden keine Unterverzeichnisse ausgelesen. Die Überprüfung (154) hierfür findet dann ebenfalls in dem Schleifendurchlauf statt. Findet die Funktion im aktuellen Verzeichnis ein weiteres Unterverzeichnis (159), ruft sie sich mit dem Pfad zum Unterverzeichnis als Parameter erneut auf (142) und durchläuft dann das Unterverzeichnis.

Findet die Funktion eine Datei (161), so überprüft Sie zuerst (162), ob sie den Verzeichnisnamen oder den kompletten Pfad als Überschrift weiterleiten soll, bevor sie die Datei an die Funktion buildArray() (164) zur weiteren Bearbeitung übergibt. Als Rückgabewert der Funktion erhält sie ein Array mit den Dateiinformationen (Pfad, Datum, Größe). Wurden alle Verzeichnisse durchsucht, wird das komplett ausgefüllte Array an die aufzurufende Stelle zurückgeliefert (170).

142:

143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
function scan_dir($dir$type=array(),$only=FALSE$allFiles=FALSE
       $recursive
=TRUE$onlyDir="", &$pictures) {

    
$handle = @opendir($dir);
    
    if(!
$handle)
        return 
false;
    
    while (
$file = @readdir ($handle)) {
        if (
eregi("^\.{1,2}$",$file)) {
            continue;
        }
        
        if(!
$recursive && $dir != $dir.$file."/") {
            if(
is_dir($dir.$file))
                continue;
        }
        
        if(
is_dir($dir.$file)) {
            
scan_dir($dir.$file."/"$type$only$allFiles$recursive$file$pictures);
        } else {
            if(
$only)
                
$onlyDir $dir;
            
$pictures buildArray($dir,$file,$onlyDir,$type,$allFiles,$pictures);
        }
    }

    @
closedir($handle);

    return 
$pictures;
  
}
Beispiel 7.4: searchFiles.inc.php

function buildArray($dir,$file,$onlyDir,$type,$allFiles,$pictures)
   @param   string   $dir
   @param   string   $file
   @param   string   $onlyDir
   @param   array   $type
   @param   bool     $allFiles
   @param   array   $pictures
   @return   array   $pictures

Die Funktion buildArray() erhält von der Funktion scan_dir() jeweils eine gefundene Datei, die sie dann überprüft und gegebenenfalls in das Array $pictures mit aufnimmt. Im ersten Schritt überprüft (104) die Funktion, ob es sich um eine gültige Dateiendung (z. B. gif oder jpg) handelt (bei der Überprüfung wird keine Rücksicht auf Groß- und Kleinschreibung genommen).

Sollte die Überprüfung erfolgreich gewesen sein, wird diese Datei mit in das auszugebende Array aufgenommen. Wenn Sie bei dem Programmstart den Parameter $allFiles auf TRUE gesetzt haben, wird die vorherige Überprüfung außer Kraft gesetzt und die Datei beim letzten Sicherheitscheck (108) mit in das Verzeichnis aufgenommen, da Sie dann alle Dateien auflisten möchten.

Das Array wird jetzt mit dem Verzeichnisnamen (112), dem kompletten Pfad (113), den Dateinamen (114), der Dateigröße (115) sowie dem Datum (116) der letzten Aktualisierung der Datei in das Array geschrieben. Da bei einer rekursiven Funktion das Ursprungsverzeichnis „verschluckt“ wird und somit nicht alleine, sondern nur als komplette Pfadangabe in einer Variablen verfügbar ist, findet hier (109) eine letzte Überprüfung statt.

Würde man dies nicht machen, könnte es passieren, dass bei Bildern, die im Ursprungsverzeichnis liegen, der Verzeichnisname bei der Ausgabe nicht sichtbar wäre. Wurden alle Angaben in das Array geschrieben, so gibt die Funktion buildArray() das Array wieder zurück (119) an die aufgerufene Funktion scan_dir().

100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
function buildArray($dir,$file,$onlyDir,$type,$allFiles,$pictures) {
    
$typeFormat FALSE;
            
    foreach (
$type as $item) {
      if (
strtolower($item) == substr(strtolower($file), -strlen($item)))
            
$typeFormat TRUE;
    }

    if(
$allFiles || $typeFormat == TRUE) {
        if(empty(
$onlyDir))
            
$onlyDir substr($dir, -strlen($dir), -1);

        
$pictures[$dir]['name']['dir']    = $onlyDir;
        
$pictures[$dir]['name']['path']    = $dir;
        
$pictures[$dir][$file]['file']    = $file;
        
$pictures[$dir][$file]['size']    = filesize($dir.$file) / 1024;
        
$pictures[$dir][$file]['time']    = filemtime($dir.$file);
    }
    
    return 
$pictures;
}
Beispiel 7.5: searchFiles.inc.php

function buildSites($pictures)
   @param   array   $pictures
   @return   string   $ausgabe

Nachdem das Array durch die Funktionen scan_dir() und buildArray() gebildet wurde, müssen wir im letzten Schritt nur noch die Ausgabe für die Website vorbereiten. An dieser Stelle ist es Ihnen überlassen, ob Sie auf die bestehende Funktion zurückgreifen oder das Array an eine eigene Funktion übergeben.

In einem späteren Beispiel in diesem Buch werden wir dieses Array dafür nutzen, um die Ausgabe nicht als Text, sondern mit Vorschaubildern (Thumbnails) zu erstellen. Wie schon am Beginn dieses Beispiels erklärt wurde, ist die Ausgabe valide zu HTML 4.01 und CSS 2, somit eine Grundvoraussetzung für eine barrierefreie Darstellung.

Folgende CSS-Parameter werden beim Aufbau genutzt:

  • <div id="navBar">
  • <div id="sectionLinks">
  • <h3>
  • <ul>
  • <li>

Sie können damit das Erscheinungsbild selbst beeinflussen, da die Werte über die CSS-Definitionen im Kopfbereich der Datei searchFiles.php definiert werden. Sie haben als Rückgabewert der Funktion scan_dir() das vollständige Abbild Ihrer Verzeichnissuche in Form eines Arrays erhalten.

Dieses Array wird im letzten Schritt an die Funktion buildSites() (53) übergeben, wo dann als Nächstes der interne Zeiger des Arrays auf sein erstes Element gesetzt wird.

Da unser Array mehrdimensional ist, und wir jedes Element durchlaufen müssen, sehen Sie nachfolgend eine verkürzte Ausgabe des Beispiel-Arrays.

Array
(
   [Bilder/Thailand/] => Array
      (
         [name] => Array
         (
            [dir] => Bilder/Thailand/
            [path] => Bilder/Thailand/
         )
         [Hotel.jpg] => Array
         (
            [file] => Hotel.jpg
            [size] => 14.587890625
            [time] => 1142254219
         )
         [Ausflug nach Krabi.jpg] => Array
         (
            [file] => Ausflug nach Krabi.jpg
            [size] => 14.7666015625
            [time] => 1142254220
         )
      )
)

Im äußeren Schleifendurchlauf (58) werden wir die einzelnen Verzeichnisnamen aus dem Array extrahieren (59), bevor wir dann im inneren Schleifendurchgang das Array zerlegen, das wir zuvor aus $array (58) ziehen konnten. Im inneren Schleifendurchgang müssen wir dann lediglich unser Array in seine Keys und Werte splitten (61), wobei unser Wert ($array1) wiederum ein Array ist.

Die Auflistung der Dateien ist relativ simpel, wenn man sich den zuvor gezeigten Array-Ausschnitt ein wenig näher betrachtet. Zum Schluss werden die einzelnen Werte formatiert (64-67) und danach in die Variable $ausgabe (69-71) gespeichert. Wurde der innere und äußere Schleifendurchlauf komplett verarbeitet, so wird die Variable $ausgabe (80) an die aufgerufene Stelle zurückgegeben.

053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
function buildSites($pictures) {
   
reset ($pictures);
    
   
$ausgabe .= '<div id="navBar">' "\n";
   
$ausgabe .= '    <div id="sectionLinks">' "\n";
   foreach(
$pictures as $key => $array) {
      
$ausgabe .= '        <h3>'.$pictures[$key]['name']['dir'].'</h3>' "\n";
      
$ausgabe .= '        <ul>' "\n";
      foreach (
$array as $key2 => $array1) {
        
         if(!empty(
$pictures[$key][$key2]['file'])){
            
$size     =    number_format($pictures[$key][$key2]['size'], 1',''.');
            
$date     =    date("d.m.Y, H:i:s"$pictures[$key][$key2]['time']);
            
$alt      =    'Datum: ' $date ' / Größe: ' $size 'KB'
            
$path     $pictures[$key]['name']['path'].$pictures[$key][$key2]['file'];
            
$ausgabe .= '            <li><a href="'.$path.'" target="_blank" title="'.$alt.'">';
            
$ausgabe .= $pictures[$key][$key2]['file'];
            
$ausgabe .= '</a></li>' "\n"
         }

      }
      
$ausgabe .= '        </ul>' "\n";
   }
    
   
$ausgabe .= '    </div>' "\n";
   
$ausgabe .= '</div>' "\n";
    
   return 
$ausgabe;
}
Beispiel 7.6: searchFiles.inc.php

Unsere Auflistung des Verzeichnisses ist fertig! Anhand der beiden Bilder können Sie die Wirkungsweise für die Überschriften sehen – einmal den kompletten Pfad, das andere Mal nur den Verzeichnisnamen.

Sie finden im beiliegenden ZIP-Archiv beide Dateien für dieses Beispiel, sofort einsetzbar. Wir verzichten hier auf die Darstellung der reinen HTML-Datei und ihrer CSS-Definitionen, da diese mehr als eine Seite füllen würde – wertvoller Platz, der für andere Beispiele besser genutzt werden kann.

Wie bereits im Vorfeld erwähnt, sehen Sie hier alles, um auch ohne diese HTML-Seiten arbeiten zu können, da die CSS-Definitionen von Ihnen kommen können und die Klassennamen am Anfang dieses Beispiels bereits erwähnt wurden.



Abbildung 7.2: Ausgabe im Browser: Dateien finden (mit CSS)



 


Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!

Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.


 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner LeaseWeb Germany GmbH
Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


DM Solutions
Microsoft Deutschland GmbH
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2013 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt