Bilder dynamisch auf HP darstellen

Reseter

Grünschnabel
Hallo,

folgendes möchte ich auf meiner Homepage realisieren.

Ich habe vor meinem Meerwasseraquarium eine Webcam stehen. Alle 5 Minuten wird ein Bild per ftp auf meinen Webspace gespeichert.

Die Struktur der Bilder sieht so aus.

Es wird automatisch jeden Tag ein Ordner mit dem Format JJJJMMTT (20090912) erstelt. Darunter sind die Bilder mit dem Format HHMMSS.x.jpg (105222.3.jpg) abgelegt.

Nun möchte ich immer das aktuellste Bild auf meiner Hompage zeigen.

Für eure Hilfe möchte ich mich jetzt schon bedanken.

Gruß Reseter
 
Hallo,

zunächst müsstest du mittels der dir-Klasse die Verzeichnisse in ein Array einlesen:

PHP:
$ordner = array();
$d = dir("/pfad/wo/die/Ordner/mit/dem/Namen/Datum/liegen");
while($e = $d->read())
{
    if(is_dir($e) && $e != '.' && $e != '..')
    {
         $ordner[] = $e;
    }
}
$d->close();

Anschließend das Array absteigend sortieren:

PHP:
arsort($ordner);

Nun kannst du das erste Element aus dem Array heranziehen um die Bilder darin zu lesen, um diese wiederum in ein Array zu packen:

PHP:
$neuester_bilder_ordner = $ordner[0];
$bilder = array();
$d = dir($neuester_bilder_ordner);
while($e = $d->read())
{
    if(is_file($e) && preg_match('/jpg$/', $e))
    {
         $bilder[] = $e;
    }
}

Auch das Bilder-Array musst du umgekehrt sortieren, das Bild im Array mit dem ersten Index ist das gewünschte:

PHP:
arsort($bilder);
$neuestes_bild = $bilder[0];
echo '<img src="/' . $neuester_bilder_ordner .'/' . $neuestes_bild . '"/>';

So könnte es funktionieren.
 
Hallo,

leider kommt beim lesen des neuesten Ordner folgender Fehler.

Fatal error: Call to a member function read() on a non-object

PHP:
$neuester_bilder_ordner = $ordner[0];
$bilder = array();
$d = dir($neuester_bilder_ordner);
while($e = $d->read())                                      "Hier kommt der Fehler
{
    if(is_file($e) && preg_match('/jpg$/', $e))
    {
         $bilder[] = $e;
    }
}

Gruß
Reseter
 
Zuletzt bearbeitet von einem Moderator:
Mach mal vor die Zeile

PHP:
$neuester_bilder_ordner = $ordner[0];

diese Zeile und poste das Ergebnis:

PHP:
echo "<pre>"; var_dump($ordner); echo "</pre>";

PS: Bitte PHP-Code-Tags verwenden. Danke.
 
Ich denke, ich hab den Fehler gefunden, den ich bereits im Script verursacht habe:

PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);
$path = "/pfad/wo/die/Ordner/mit/dem/Namen/Datum/liegen";
$ordner = array();
$d = dir($path);
while($e = $d->read())
{
    if(is_dir($path . DIRECTORY_SEPARATOR . $e) && $e != '.' && $e != '..')
    {
         $ordner[] = $e;
    }
}
$d->close();  

arsort($ordner); 

$neuester_bilder_ordner = $ordner[0];
$bilder = array();
$d = dir($path . DIRECTORY_SEPARATOR . $neuester_bilder_ordner);
while($e = $d->read())
{
    if(is_file($path . DIRECTORY_SEPARATOR . $neuester_bilder_ordner . DIRECTORY_SEPARATOR . $e) && preg_match('/jpg$/', $e))
    {
         $bilder[] = $e;
    }
} 

arsort($bilder);
$neuestes_bild = $bilder[0];
echo '<img src="/' . $neuester_bilder_ordner .'/' . $neuestes_bild . '"/>';

Schau mal, ob es damit geht.
 
Zur "effizienteren" Abarbeitung könnte man auch -anstatt erstmal den Dateibaum komplett einzulesen- einfach nach dem neuesten Ordner gesucht werden, dann nach der neuesten Bilddatei. (filectime() oder filemtime())

Noch einfacher wäre es, wenn man nicht neue Bilder erstellt, sondern den Bildnamen statisch lässt. Somit bleibt die ganze HTML-Datei statisch. Um den Cache zu überlisten, müsste man beim Reload vielleicht noch eine zufällige GET-Variable (zB Timestamp) anhängen.

mfg chmee
 
Hallo,

mit einer kleinen änderung der sortierung funktionierts.

Geändert habe ich von

PHP:
arsort($ordner);

arsort($bilder);
auf
PHP:
rsort($ordner);

rsort($bilder);

Hier nocheinmal den ganzen Code
PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);
$path = "cam/";
$ordner = array();
$d = dir($path);
while($e = $d->read())
{
    if(is_dir($path . DIRECTORY_SEPARATOR . $e) && $e != '.' && $e != '..')
    {
         $ordner[] = $e;
    }
}
$d->close();  

rsort($ordner);
//print_r($ordner);

$neuester_bilder_ordner = $ordner[0];
$bilder = array();
$d = dir($path . DIRECTORY_SEPARATOR . $neuester_bilder_ordner);
while($e = $d->read())
{
    if(is_file($path . DIRECTORY_SEPARATOR . $neuester_bilder_ordner . DIRECTORY_SEPARATOR . $e) && preg_match('/jpg$/', $e))
    {
         $bilder[] = $e;
    }
} 

rsort($bilder);
//print_r($bilder);
$neuestes_bild = $bilder[0];
echo '<img src="/' . $neuester_bilder_ordner .'/' . $neuestes_bild . '"/>';

Danke für Deine Hilfe!

Gruß
 
Zurück