• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

neuste Datei (jpeg Bild) aus einem Verzeichnis laden

jack.x

Neues Mitglied
Hi,
ich habe mir gerade eine neue IP Cam (IPCC B12N) zugelegt, da meine alte 'dbpower' immer häufiger Aussetzer hat. Beides sind IP Kameras, also nicht direkt mit einem Server verbunden, sondern sie aggieren quasi selbst als Server und laden Bilder per FTP hoch, bzw. können direkt im Streaming Modus geöffnet werden.
Mit der alten dbpower-Cam habe ich alle 60 Sekunden einen Schnappschuss auf meinen Websspace hochgeladen. Dabei konnte ich den Filename selber wählen und dieses Bild wurde idealerweise von dem jeweils neueren überschrieben. Der Aufruf des akteullsten Bildes durch meine Webseite war dementsprechend einfach.
Die neue Kamera macht das nun leider anders. Sie läd auch alle Minute ein Bild hoch, aber sie vergibt automatisch einen Dateinamen, gebildet aus Datum und Uhrzeit und sie legt für jeden Tag ein neues Verzeichnis an. E sist schön, da so die alten Bilder als History verfügbar bleiben. Aber für den Aufruf durch die Webseite habe ich bisher keine Lösung, da sich der Name ja ständig ändert. Die Vorhersage (Berechnung) des nächsten Filenamen ist praktisch unmöglich, da auch die Hunderstelsekunden Teil des Namen sind (Beisp.: IMG_chn0_TIMER_MNG_20150425163025_004.jpg) Wahrscheinlich würde man besser das Datei-Erstellungs Datum zur Bestimmung heranziehen.
Hat jemand eine Idee, oder vielleicht sogar ein Beispiel, wie man so ein Problem lösen kann?
Gruß Jack.X
 
Zuletzt bearbeitet:
Werbung:
Durch Berechnung. Um innerhalb eines Vezeichnisses die zuletzt veränderte Datei zu finden, holt man sich die aktuelle Zeit und wendet auf die Dateien bsw. die JS Methode lastModified an oder extrahiert aus den Dateinamen die Zeit und bildet daraus auch einen Timestamp. Die am nähesten zur aktuellen Zeit liegende Datei ist dann die zuletzt veränderte. Näheres zum Date Object für PHP und JavaScript findest du in den Docs.

Bleibt noch das Problem mit den unterschiedlichen Verzeichnissen. Falls das aktuelle nicht das erste oder letzte sein sollte, entweder alle darin liegenden Files in ein Directory kopieren oder du musst beim Datumsvergleich über die Folder iterieren.
 
1. Vielen Dank. Das muss ich mir mal genau anschauen. Muss ich dazu alle Dateinamen aus dem ganzen Verzeichnis z.B. in ein Array einlesen? Das sind pro Tag 1440 Dateien.

2. Ich hatte gerade noch eine Idee, ob man eventuell sowas wie Wildcard benutzen könnte? Bis auf die letzten 6 Stellen kann ich den Dateinamen nämlich ohne Problem 'errechnen'. Die letzten 6 Stellen sind dann 2 digits für die Sekunden Bindestrich und 3 nummerische Stellen (001 - 009) die ich leider nicht errechnen kann.

3. Man könnte doch eigentlich auch die ersten Stellen berechnen und die fehlenden Kombinationen durchprobieren. Das wären dann maximal 60 * 9 Versuche. Wenn RC>0, nächster Versuch. Das sollte doch recht flott gehen. Das probier ich wohl mal aus.
Gruß Jack.X
 
Werbung:
Ich würde es etwas einfacher angehen: Der Dateiname des Bildes enthält ja einen Zeitstempel. Die Dateinamen mit glob() in ein Array einlesen und dieses umgekehrt sortieren. Dann ist das erste Element im Array die neueste Datei. Etwa so:
PHP:
$images = glob("*.jpg");
rsort($images);
$newestimg = $images[0];
Um festzulegen, wie man das Verzeichnis auswählt, müsste man wissen, wie der Dateiname aufgebaut ist. Wenn er keinen Zeitstempel enthält, kann man natürlich die Änderungzeit heranziehen.
 
Zuletzt bearbeitet von einem Moderator:
So auf den zweiten Blick benötigst du das Date Object wahrscheinlich gar nicht. Ein neueres Foto hat doch immer einen höheren Zahlenwert als ein älteres. Einfach alle Dateinamen in ein Array einlesen, aufsteigend sortieren und das letzte Element ausgeben lassen.

/edit: Sempervirum hatte wohl die selbe Idee und war schneller. ;)
 
PS: Anstatt das neueste Verzeichnis auszuwählen könnte man auch den RecursiveDirectoryIterator verwenden, um alle Dateien zu ermitteln. Die Dateinamen der Bilder sind ja eindeutig.
 
Werbung:
Das mit dem php sieht einfach und genial aus, aber ich habe mir gerade die Finger gebrochen, da ich noch nie selber php programmiert habe. Unglaublich wie viele Fehler man (ich) in 5 Zeilen Code einbauen kann. :rolleyes:
Schliesslich habe ich einen Teilerfolg zu verzeichnen. Meine 'newest.php' errechnet das aktuelle Verzeichnis und zeigt das neuste Bild der Webcam an. Allerdings funzt das nur, wenn die newest.php im gleichen Verzeichnis wie die Bilder steht. Da dieses Verzeichnis aber täglich neu angelegt wird, geht das natürlich nicht. Die Datei muss also in einem unveränderlichen Verzeichnis stehen. Mir ist es jetzt noch nicht gelungen die newest.php in einem anderen als dem eigenen Verzeichnis zu suchen.
Jack.X
 
Ich habe jetzt den Befehl chdir gefunden, aber der tut nicht. Vermutlich wieder mal ein Syntax Error.
So sieht es jetzt aus.

<html>
<head>
<title>PHP-Test</title>
</head>
<body>
<?php
$today = date("Ymd");
$dir = "/webcam/$today/IMG001/";
chdir("/webcam/20150426/IMG001/");
$images = glob("*.jpg");
rsort($images);
$newestimg = $images[0];
$url = "http://www.Test.com/webcam/$today/IMG001/$newestimg";
echo "<p><img src=$url ></p>";
?>
</body>
</html>

Wie gesagt, im gleichen Verzeichnis wie die Bilder, funzt die php. Der Befehl chdir hat bisher keine Wirkung, egal ob ich den Pfad in Klartext, oder über eine Variable einfüge.
Jack.X
 
Wie ich oben schon schrieb, glaube ich, dass es mit dem RecursiveDirectoryIterator einfacher geht. Probier mal, ob dir dies weiter hilft:
PHP:
$filename = "0";
$pathname = "";
$it = new RecursiveDirectoryIterator("img/", FilesystemIterator::SKIP_DOTS);
foreach ($it as $fileinfo) {
$newfilename = $fileinfo->getFilename();
if (strcmp($filename, $newfilename) < 0) {
$filename = $newfilename;
$pathname = $fileinfo->getPathname();
}
}
echo $filename . " " . $pathname;
Das "img/" gegen dein Bilderverzeichnis ersetzen.
 
Werbung:
PS: Dass bei dir das chdir nicht funktioniert, liegt wahrscheinlich daran, dass Du weder einen relativen noch einen vollständigen absoluten Pfad verwendest. Wie Du den absoluten Pfad ermittelst, kannst Du hier nachlesen:
http://stackoverflow.com/questions/4645082/get-absolute-path-of-current-script
Einfacher ist es wahrscheinlich, mit relativen Pfaden zu arbeiten.
Und wenn sich das Verzeichnis so einfach ermitteln lässt (sehe ich jetzt erst), geht es wahrscheinlich so am einfachsten:
PHP:
$today = date("Ymd");
$dir = "webcam/$today/IMG001/";
$images = glob($dir . "*.jpg");
rsort($images);
$newestimg = $images[0];
 
Cool. Jetzt habe ich 2 unterschiedliche Versionen. Und das beste es funzt beides.
Bisher habe ich beide Versionen direkt ausgeführt. Das funktioniert.
Im Momement probiere ich mich an dem Aufruf des php codes aus dem html dokument und der Übergabe des Ergebnisses, also der URL für das neuste Bild.
Was soll ich sagen es funzt noch nicht. Aber das sollte ja jetzt das geringere Problem sein.

Das sind meine ersten Versuche mit php. Ich sehe schon das kann Spaß machen und es bietet viel mehr Möglichkeiten als Javascript. Aber die Syntaxregeln sind etwas gewöhnungsbedürftig.
Beispiel: glob($dir . "*.jpg"); - Der Punkt zwischen $dir und "*.jpg", da wäre ich nie drauf gekommen. Ich habe mir unzählige Beispiele angeschaut, konnte diese Syntax aber aus keinem Beispiel ableiten.
Na ja das wird schon.

Ich freue mich schon darauf wenn die neue Cam online gehen kann. Meine alte Cam macht unscharfe 640x480 Bilder, die neue kann scharfe 1280x720.
Danke für die nette Unterstützung. Ich habe mich ernstgenommen gefühlt, obwohl ich sicher etwas blauäugig an das Thema heran gegangen bin.
Jack.X
 
... das sollte ja jetzt das geringere Problem sein.

Von wegen. Ich kriege einfach nicht raus wie ich mein php script aus einem html Dokument aufrufen kann und das Ergebnis übergeben kann.
Ich dachte, an der Stelle , an der bisher der absoluten Link zum entsprechenden Bild steht, muss nun der php Code ausgeführt werden und der dynamische Link muss übergeben und ausgeführt werden.
Ich habe bisher ohne Erfolg den Befehl <script src="newest.php"></script> zum Aufrufen ausprobiert. Ich kann nicht sagen ob sich etwas tut, ich sehe jedenfalls nichts. Wie bekomme ich das Ergebnis zurück um das entsprechende Bild im Browser anzuzeigen?
Mir ist schon klar HTML läuft im Browser und php auf dem Server. Aber das Ergebnis brauche ich doch im Browser. Da will ich ja schliesslich mein Bild anzeigen. Wie kommt das Bild in den Browser?
Jack.X
 
Werbung:
Das ist für Javascript:
HTML:
<script src="newest.php"></script>
Du musst deine PHP-Datei mit include einziehen. Dann wird sie auf dem Server ausgeführt und das Ergebnis gelangt an den Browser:
HTML:
<?php include('newest.php'); ?>
<img src="<?php echo $deine_php_variable ?>">
Weil das include PHP ist, muss diese Datei ebenfalls die Endung php haben.
 
So jetzt ...
Ich habe das Problem schliesslich mit iframe gelöst.
Ich rufe mein php-script, welches ja für sich alleine schon seit einigen Tagen funzte, jetzt einfach in einem iframe auf. Ich habe noch etwas Probleme mit der Größenanpassung, aber es läuft erst mal und die Cam ist online.
http://www.schau-rhein.de/webcam.htm

Ein neues Problem ergibt sich aber aus der Tatsache, daß meine Cam bei etlichen Webcam Diensten gelistet ist. Diese Dienste benötigen alle einen festen Link zum aktuellsten Bild. Da die Cam aber im Normalfall ohne angeschlossenen Server ihren Dienst tut, wird das schwierig. Ich habe zwar schon mal ein copy Befehl in das php-script eingebaut, das funktioniert auch, setzt aber vorraus das das Script auch regelmässig (alle 60 sek.) ausgeführt wird.
Für dieses Problem habe ich noch keinen Ansatz.
Gruß Jack.X
 
So jetzt ...
Ich habe das Problem schliesslich mit iframe gelöst.
Ich rufe mein php-script, welches ja für sich alleine schon seit einigen Tagen funzte, jetzt einfach in einem iframe auf. Ich habe noch etwas Probleme mit der Größenanpassung, aber es läuft erst mal und die Cam ist online.
http://www.schau-rhein.de/webcam.htm

Ein neues Problem ergibt sich aber aus der Tatsache, daß meine Cam bei etlichen Webcam Diensten gelistet ist. Diese Dienste benötigen alle einen festen Link zum aktuellsten Bild. Da die Cam aber im Normalfall ohne angeschlossenen Server ihren Dienst tut, wird das schwierig. Ich habe zwar schon mal ein copy Befehl in das php-script eingebaut, das funktioniert auch, setzt aber vorraus das das Script auch regelmässig (alle 60 sek.) ausgeführt wird.
Für dieses Problem habe ich noch keinen Ansatz.
Gruß Jack.X

Du musst das anders aufbauen.
Soweit ich dich verstehe benötigst du einfach einen statischen Link, der zum aktuellsten Bild führt, zB:
www.schau-rhein.de/webcam/latest.php

Statt unter dieser Adresse jetzt extra HTML auszugeben, welches den richtigen Link zum Bild enthält, könntest du auch direkt das Bild per PHP zurückgeben:
PHP:
<?php
header('Content-Type:image/jpeg');
header('Content-Length: '. filesize($lokaler_pfad_zu_deinem_bild));
readfile($lokaler_pfad_zu_deinem_bild);

Wenn du dann oben genannte Adresse aufrufst, bekommst du das aktuelle Bild geliefert als würdest du das Bild direkt aufrufen.

Besser noch wäre X-Sendifle. Aber das oben sollte für deine Zwecke reichen.
 
Werbung:
@scbawik: Das ist genau was ich die ganz Zeit wollte, aber ich kriege gerade mal wieder die Krise weil diese 4 Zeilen nicht das tun was sie sollen. Ich habe jetzt mal die Generierung des Filenamens weggelassen und ihn statt dessen in Klartext eingegeben. Das php-script liegt im root Verzeichnis, das image liegt auf ../webcam/20150501/IMG001/IMG_chn0_TIMER_MNG_20150501104041_003.jpg

PHP:
<html>
<head>
<title>newest42.php</title>
</head>
<body>
<?php
$file = 'webcam/20150501/IMG001/IMG_chn0_TIMER_MNG_20150501104041_003.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: ' . filesize($file));
readfile($file);
?>
</body>
</html>

Das Ergebnis ist ein schwarzer Bildschirm mit der Fehlermeldung:
Die Grafik "http://.../newest42.php" kann nicht angezeigt werden weil sie Fehler enthält.

Die jpeg-Datei ist natürlich vorhanden. Sie kann im Browser angezeigt werden, wenn sie direkt aufgerufen wird. Ich habe das script auch mit anderen existierenden Bildern (auch nicht Webcam Bilder) getestet, jeweils mit dem gleichen Ergebnis.
Was läuft da schief?

Jack.X
 
Lass den HTML-Code darin weg, der hat darin nichts zu suchen.
 
... ich hatte mich schon gewundert. Bei etlichen Beispielen im Netz hatte ich das genau so mit html code gefunden.

ES GEHT !!!

P.S.: ... nur meine Cam hat sich gerade erhängt, sendet keine neuen Bilder mehr. Aber ich habe ja jetzt Kapazitäten frei um mich um dieses Problem zu kümmern.
 
Werbung:
Hallo Jack:x

Ich stehe genau vor dem gleichen Problem und möchte meine Webcam auf der Homepage einbinden.
Diese übermittelt die Bilder leider auch in unterschiedliche Verzeichnisse welche Nach Jahr/Monat/Tag automatisach generiert werden.
Bin auf der Suche nach einer Lösung, und hoffe du kannst mir helfen.

Danke
LG
Bernd
 
Zurück
Oben