Wer Dateien auf seinem Server zum Download freigibt, nutzt oft die Möglichkeit des Verzeichnis-Browsings. Damit wird dem Benutzer ermöglicht, sich frei in den Verzeichnissen des Servers zu bewegen. Mit etwas PHP kann das Verzeichnis-Browsing beliebig angepasst werden.
Es wird eine PHP-Datei »liste.php« angelegt, in der zunächst ein HTML-Dokument angelegt und eine Tabelle eröffnet werden:
<html>
<head>
<title>Inhalt des Verzeichnisses</title>
</head>
<body>
<table>
Es folgt der PHP-Teil, in dem zunächst einige Variablen angelegt werden:
<?
$stamm = "/homepages/x/xxxxxxxxx/htdocs";
$dir = $stamm.$REQUEST_URI;
$uri = $REQUEST_URI;
$verzeichnisse = array();
$dateien = array();
$liste = "";
Die Variable $stamm gibt den Serverpfad an, auf den die Domain verweist. $dir gibt den Serverpfad zu dem jeweiligen Verzeichnis an, in dem man sich gerade befindet. $uri verweist auf die aktuelle URI.
Anschließend werden die beiden Arrays $verzeichnisse und $dateien, sowie die Variable $liste angelegt.
Beispielanzeige
Um es zu ermöglichen, beim Browsing in höhere Verzeichnisebenen zu gelangen, wird folgende Anweisung festgelegt:
if(substr_count($REQUEST_URI, "/") > 1) $liste .= "<tr><td></td><td
style=\"font-family:monospace\"><a href=\"../\">Eine Ebene höher</a></td></tr>\r\n";
Da beim Einlesen des Verzeichnisinhalts Verzeichnisse und Dateien ungeordnet aufgenommen werden, berücksichtigt das Script zunächst nur die Verzeichnisse, um diese später vor den Dateien anzuordnen:
$lese_dir = opendir($dir);
while($datei = readdir($lese_dir)) {
if($datei != ".." && $datei != "." && is_dir($dir.$datei))
array_push($verzeichnisse, $datei);
}
closedir($lese_dir);
Der Variablen $lese_dir wird das aktuelle Verzeichnis mittels opendir() zugewiesen. In der while-Schleife werden mittels readdir() die Dateien des Verzeichnisses einzeln bearbeitet. In der if-Schleife werden mittels is_dir() nur die Verzeichnisse berücksichtigt – mit Ausnahme der beiden Pseudo-Verzeichnisse »..« und ».«.
Die berücksichtigten Verzeichnisse werden in dem Array $verzeichnisse gespeichert.
Die Prozedur wird erneut ausgeführt, um alle Dateien in dem Array $dateien zu speichern:
$lese_dir = opendir($dir);
while($datei = readdir($lese_dir)) {
if(is_file($dir.$datei)) array_push($dateien, $datei);
}
closedir($lese_dir);
Anschließend werden die Inhalte der Arrays $verzeichnisse und $dateien alphabetisch geordnet:
sort($verzeichnisse);
sort($dateien);
Da Verzeichnisse und Dateien jetzt eingelesen sind, werden sie nacheinander in der Variablen $listte entsprechend aufbereitet gespeichert:
for($i=0; $i<sizeof($verzeichnisse); $i++) {
$liste .= "<tr><td></td><td style=\"font-family:monospace\"><a
href=\"".$uri.$verzeichnisse[$i]."\"
<".$verzeichnisse[$i]."</a></td></tr>\r\n";
}
Mittels einer for-Schleife wird jedes Verzeichnis mit einem Link an die Tabelle angegeliedert.
Bei den Dateien wird ähnlich verfahren. Hier werden jedoch auch Dateityp und Dateigröße ausgelesen und ausgegeben:
for($i=0; $i<sizeof($dateien); $i++) {
$info = pathinfo($dir.$dateien[$i]);
$endung = $info["extension"];
$endung = strtoupper($endung);
$groesse = filesize($dir.$dateien[$i]);
if($groesse < 1024) {
$einheit = "Byte";
} else if($groesse >= 1024 && $groesse < 1048576)
{
$groesse = round($groesse / 1024);
$einheit = "KB";
} else {
$groesse = round($groesse / 1024 / 1024);
$einheit = "MB";
}
$groesse = number_format($groesse, 0, ",", ".");
$liste .= "<tr><td style=\"font-family:monospace\">".$endung."</td><td
style=\"font-family:monospace\"><a href=\"".$uri.$dateien[$i]."\">".$dateien[$i]."</a>
(".$groesse." ".$einheit.")</td></tr>\r\n";
}
Innerhalb der for-Schleife werden zunächst mittels pathinfo Informationen über die aktuelle Datei eingeholt. In der Variablen $endung wird die Dateiendung der jeweiligen Datei gespeichert. Über strtoupper() wird die Endung in Großbuchstaben dargestellt.
Anschließend wird über filesize() die jeweilige Dateigröße ermittelt und in $groesse gespeichert. Die anschließende if-Anweisung rechnet die Dateigröße gegebenenfalls von Bytes in Kilobytes oder Megabytes um. Über number_format() wird als Tausendertrennzeichen der Punkt gewählt.
Beispielanzeige
Dann wird die Datei mit Angabe der Dateiendung und -größe in $liste gespeichert.
Im letzten Schritt wird der Inhalt von $liste ausgegeben und das HTML-Dokument geschlossen:
echo $liste;
?>
</table>
</body>
</html>
Damit die PHP-Datei »liste.php« in jedem Verzeichnis aufgerufen wird, dürfen in den Verzeichnissen keine Index-Dateien (»index.php«, »index.html« etc.) vorhanden sein. Außerdem muss ein Eintrag in die ».htaccess« gemacht werden:
ErrorDocument 403 /liste.php
Beide Dateien müssen im Stammverzeichnis zur Domain abgelegt werden. Da beim Nichtvorhandensein einer Index-Datei und ausgeschaltetem Verzeichnis-Browsing in der ».htaccess« ein Fehler 403 erzeugt wird, wird die Datei »liste.php« aufgerufen.
Natürlich lässt sich die Darstellung der Verzeichnisinhalts beliebig abändern. Wer sich die Arbeit machen will, kann zum Beispiel eigene Icons für die verschiedenen Dateitypen entwerfen und statt der bloßen Dateiendung anzeigen lassen. ™
Erstveröffentlichung 08.03.2006
Wie hilfreich war dieser Beitrag?
Klicke auf die Sterne um zu bewerten!
Durchschnittliche Bewertung 0 / 5. Anzahl Bewertungen: 0