Dynamisch erstellte Grafik erst nach "reload"
dbuergin
- multimedia (audio & video)
0 Michael S.0 dbuergin0 globe0 Michael S.0 dbuergin
Hallo zusammen
Folgendes Problem. Ich habe ein CGI(Perl) Script geschrieben, welches etwas Text,
eine dynamisch erzeugte Grafik und ein kleines
Formular ausgibt. Das Formular dient zur Veränderung der Parameter
für die Grafik. Durch drücken des "submit" Buttons, wird das Script
mit den neuen Parametern wieder aufgerufen und sollte die neu
erstellte Grafik anzeigen.
Die Grafik ist ein PNG und wird mit den RRD Tools von:
http://oss.oetiker.ch/rrdtool/ erzeugt.
Die Grafik wird im Script folgendermassen erzeugt:
&rrd_graph ($filename_rrd, $filename_48h_png, $start, $ende);
Dannach gebe ich einen IMG Tag aus mit dem relativen Pfad auf
die Grafik:
print "<IMG BORDER=1 ALT="Desc" SRC="$filename_display_48h_png"><br>\n";
Soweit funktioniert nun auch alles, bis auf die Tatsache, dass
mein Browser (IE 6.0)
nicht die neu generierte Grafik anzeigt, sondern diejenige, welcher
er noch in seinem Cache hat. Erst nach einem reload im Browser
sehe ich die neue Grafik.
Ich habe nun versucht, mit diversen Header-Tags das Problem
zu lösen, aber ohne Erfolg:
<meta http-equiv="expires" content="Tue, 04 Dec 1999 21:21:21 GMT" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" /> ^
Hat jemand eine Idee oder einen Link auf eine Thread mit der
Lösung. Habe mich dumm und dämmlich gesucht im Web, aber ich
suche wohl nach den falschen Hinweisen.
Besten Dank
Daniel
Ich vermute dein Problem liegt darin das der Browser das Bild im Cache behält und es deshalb nicht neu geladen wird.
Header Tags in der HTML-Seite helfen in dem Fall nichts (sie gelten nur für die Seite, nicht die referenzierten Elemente). Entweder schickst du beim senden der Grafik einen entsprechenden HTTP-Header mit (ich vermute das kommt in deinem Fall nicht in Frage), oder du musst eine der unschönen Methoden anwenden:
Wenn du den Dateinamen für das Bild bei jedem neuen Erzeugen wechselst, hat der Browser das Bild noch nicht und es wird jedesmal geladen. Wenn das auch nicht geht (böser Hack), häng im IMG-Tag and dir SRC-Angabe ein "?###" an (### durch fortlaufende/zufällige Zahl ersetzen).
Besten Dank erstmal, beruhigt mich, dass ich nicht völlig einen
Blödsinn gemacht habe...
Ich vermute dein Problem liegt darin das der Browser das Bild im Cache behält und es deshalb nicht neu geladen wird.
Genau so ist es ;-(
Header Tags in der HTML-Seite helfen in dem Fall nichts (sie gelten nur für die Seite, nicht die referenzierten Elemente).
Sehr gut, das habe ich bis jetzt nicht gewusst, wieder was
gelernt
Entweder schickst du beim senden der Grafik einen entsprechenden HTTP-Header mit (ich vermute das kommt in deinem Fall nicht in Frage),
Ich habe sowas versucht, aber ohne Erfolg. Ist es richtig, dass
ich pro HTML-Seite nur ein solcher Header schicken kann ? Entweder
sah ich nur die Grafik (Content-Type: image/png), oder nur Müll,
resp. die binären Zeichen der Grafik.
oder du musst eine der unschönen Methoden anwenden:
Wenn du den Dateinamen für das Bild bei jedem neuen Erzeugen wechselst, hat der Browser das Bild noch nicht und es wird jedesmal geladen. Wenn das auch nicht geht (böser Hack), häng im IMG-Tag and dir SRC-Angabe ein "?###" an (### durch fortlaufende/zufällige Zahl ersetzen).
Ich versuch's wohl mal damit, im Perl jedem neuen Bild die ProcessID
als Namensteil anzuhängen, und es nach dem Anzeigen gleich wieder zu
löschen.
Daniel
n'abend,
Ich habe sowas versucht, aber ohne Erfolg. Ist es richtig, dass
ich pro HTML-Seite nur ein solcher Header schicken kann ? Entweder
sah ich nur die Grafik (Content-Type: image/png), oder nur Müll,
resp. die binären Zeichen der Grafik.
für jede Ressource sind eigene Header zu setzen. Beispielsweise soll eine HTML-Seite nicht gecached werden, die referenzierten Stylesheets aber schon. Die im HTML-Dokument (als Meta) angegebenen Caching Informationen sind aber nicht zuverlässig. Die beim Ausliefern der Seite mitgelieferten (Caching-)Header gelten nur für die HTML-Seite. Sie vererben sich nicht auf im HTML-Dokument referenzierte Ressourcen.
oder du musst eine der unschönen Methoden anwenden:
Wenn du den Dateinamen für das Bild bei jedem neuen Erzeugen wechselst, hat der Browser das Bild noch nicht und es wird jedesmal geladen. Wenn das auch nicht geht (böser Hack), häng im IMG-Tag and dir SRC-Angabe ein "?###" an (### durch fortlaufende/zufällige Zahl ersetzen).
Dieser "böse Hack" ist aber (gerade bei IE) oft unumgänglich. Erfahrungsgemäß laden manche Browser selbst dann Ressourcen aus dem Cache, wenn ihnen explizit gesagt wurde, dass sie nichts cachen sollen.
Ich versuch's wohl mal damit, im Perl jedem neuen Bild die ProcessID
als Namensteil anzuhängen, und es nach dem Anzeigen gleich wieder zu
löschen.
Ich habe solchen Aufrufen stets den aktuellen Timestamp angehängt.
weiterhin schönen abend...
n'abend,
Ich habe sowas versucht, aber ohne Erfolg. Ist es richtig, dass
für jede Ressource sind eigene Header zu setzen. Beispielsweise soll eine HTML-Seite nicht gecached werden, die referenzierten Stylesheets aber schon. Die im HTML-Dokument (als Meta) angegebenen Caching Informationen sind aber nicht zuverlässig. Die beim Ausliefern der Seite mitgelieferten (Caching-)Header gelten nur für die HTML-Seite. Sie vererben sich nicht auf im HTML-Dokument referenzierte Ressourcen.
Eine Möglichkeit dem Browser mitzuteilen das er das Bild nicht cachen darf wär zu dem Bild die entsprechenden HTTP-Header mitzusenden (ich meine *nicht* die ensprechenden <meta> Equivalente in HTML, sondern die HTTP-Header die vom Webserver zu dem Request in dem das Bild geladen wird gesended werden, jedes referenzierte Element wird ja in einem eigenen Request geladen).
Wie du das in Pearl genau machen musst habe ich leider keinen Plan. Mit PHP ginge es indem du statt <img src="bild.jpg"> ein script angibst <img src="sendimage.php?bild.jpg"> und dieses script dann bevor es die bild.jpg ausgibt mittels header() entsprechende HTTP-Headers erzeugt. Ich bin sicher das es mit Pearl einen analogen weg gibt (nur hab ich von Pearl eben keinen Plan :).
Eventuell kann man es auch über die .htaccess im Apache für genau diese Datei erreichen das zusätzliche no-cache header mitgesendet werden, ist hier ein Apache-Crack der sich da auskennt?
Besten Dank an Alle, es klappt.
Habe ein eigenes kleines Perl/CGI Script erstellt, welches aus
dem Hauptscript aufgerufen wird:
<IMG BORDER=1 ALT="XYZ" SRC="/cgi-bin/rrd_send_graph.pl?bild=xy.png"><br>
Dieses sendet wie vorgeschlagen einen "image/png" Header und
dannach gleich die Grafik:
.
.
print header({ -type=>"image/png", -expires=>"now"});
open GRAPH, "<$filename_png";
binmode GRAPH;
binmode STDOUT;
my $buf;
while(sysread GRAPH, $buf, 8192)
{
print $buf;
}
close GRAPH;
exit 0;
Gruss und schönes Wochenende
Daniel