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.
|