php – bilder im verzeichnis anzeigen

fuer eine kleine spielerei musste ich ein php scriptchen basteln, dass mir bilder in einem verzeichnis anzeigt. und zwar immer nur eins und beim klick auf das bild dann das naechste. das gnaze natuerlich der reihe nach alphabetisch sortiert. in meinem fall entsprachen die dateinamen dem datum und der uhrzeit in umgekehrter reihenfolge (z.b. 201103251840), so dass eine alphabetische sortierung auch gleich dem sortieren nach datum und uhrzeit entspricht.

<?php
$pfad = "/var/www/directory";
// die index.php (also diese datei hier) im 
// gleichen verzeichnis soll nicht angezeigt werden
$ausnahme = "index.php";
 
// einlesen des verzeichnisses exclusive ".", ".." 
// und der vorher definierten ausnahme in ein array
if($pointer=opendir($pfad)) 
{
    while($datei=readdir($pointer))
    { 
        if ($datei!="." && $datei!=".." && $datei!=$ausnahme) 
        { $arr[] = $datei; } 
    }
    closedir($pointer);
}
 
// array alphabetisch sortieren
array_multisort($arr);
 
$key = 0;
 
// wenns nicht das erste bild ist, die 
// position im array bestimmen
if ( ! $_POST['file'] == '' )  
{ 
    // aktuelle position im array?
    $key = array_search($_POST['file'], $arr); 
}
 
echo '<form action="index.php" method="post">';
// aktuelles bild als absende button im formular
echo '<input type="image" src="'.$arr[$key].'">';
// naechstes bild ($key+1) als uebergabeparameter 
echo '<input type="hidden" name="file" value="'.$arr[$key+1].'">';
echo '</form>';
// und noch ein paar sachen wie dateinamen, -groesse 
// und anzahl ausgeben
$filesize=round(filesize($pfad.'/'.$arr[$key])/1024,2);
echo 'file '.($key+1).'/'.count($arr).'<br />';
echo 'filename: '.$arr[$key].' <br />';
echo 'size: '.$filesize.' kB<br />';
echo '# files: '.count($arr).'<br />';
?>

davor und danach nur noch standard html header und was man so alles haben will und fertig isses.

erst dachte ich… ups.. .aufpassen, dass man damit nicht x-beliebige dateien aufm webserver anzeigen kann. aber wenn man die POST header manipuliert und eine datei wie ../../../etc/passwd aufrufen will, wird die nicht angezeigt, da sie nicht in dem dem array mit den dateien im aktuellen verzeichnis steht. faellt sonst noch jemandem ein hack dazu ein?

UPDATE: danke schonmal an roland fuer den tip mit den dateiendungen in den kommentaren. das kann jeder nach belieben einbauen. ich habe hier aber noch ein schmankerl. naemlich einfach beim laden der seite die naechsten beiden bilder “vorladen” und nur nicht anzeigen lassen. das hat den charme, dass beim klick auf das naechste bild dieses sofort und ohne wartezeit erscheint. hier der code dazu, den man natuerlich einfach erweitern kann, damit noch mehr bilder vorgeladen werden um das “durchklicken” fluessiger zu machen:

echo '<img src="'.$arr[$key+1].'" style="display:none;width:0px;height:0px;" />';
echo '<img src="'.$arr[$key+2].'" style="display:none;width:0px;height:0px;" />';

hab ich hier gefunden: http://www.flexib.de/grafiken-vorladen-html-css-javascript/

25. March 2011 by sd
Categories: Uncategorized | Tags: , | 2 comments

Comments (2)

  1. Hm, also Bilder haben ja immer eine gewisse Dateiendung, im Regelfall ist das .jpg bzw. .png. Ich würde nur die Bilddateien auflisten lassen, das ist am sichersten und Du brauchst $ausnahme auch nicht.

    Gruß,
    Roland

  2. auch ne moeglichkeit.
    koennte man so machen, in dem man das:
    $datei!=$ausnahme
    z.b. gegen das ersetzt:
    (substr(strtolower($datei), -3)==”gif”)
    und die dateiendung entsprechend setzt.
    dann kann man die zeile:
    $ausnahme = “index.php”;
    ..weglassen

Leave a Reply

Required fields are marked *