Problem mit Perl, ein server-bild (.png) auf Browser zu öffnen
marcel
0 Jörk Behrends0 gerhard
hallo leute
1)ausganssituation: der browser zeigt mir am anfang ein normales bild an.
2)drücke ich im browser auf die taste "zeige bild", so öffne ich ein .png-bild auf dem server mit folgender perl routine:
(dieses bild wird dann an den platz des ursprungsbild geöffnet usw..)
$PIC_PNG_NAME = 'bild.png';
$CHUNK_SIZE = 3000;
open( PIC_PNG, "<$PIC_PNG_NAME" )
or die( "Can't open $PIC_PNG_NAME: $!\n" );
print "Content-type: image/png\r\n";
print "\r\n";
binmode( PIC_PNG );
binmode( STDOUT );
while ( read( PIC_PNG, $data, $CHUNK_SIZE ) ) {
print $data;
}
close( PIC_PNG );
komisch ist nun, dass dies nur zu etwa 75% vom browser korrekt angezeigt wird.
in den fehlerhaften fällen passiert manchmal etwas merkwürdiges:
IE: manchmal öffnet er das bild, bevor der ladeprozess abgeschlossen ist, und zeigt dann dieses "fehlerbild",
auch wenn der ladevorgang abgeschlossen ist.
Netscape:manchmal wird das aktuelle bild nicht angezeigt, durch einen erneuten aufruf der perl funktion wird
das bild aber sofort angezeigt, ohne überhaupt noch etwas runterzuladen (d.h. muss schon irgendwo vorhanden sein).
hat jemand eine idee was mein problem ist? ich habe versucht, durch veränderung der variable $CHUNK-SIZE
einfluss darauf zu nehmen, scheint aber immer noch nicht zu 100% zu funktionieren.
oder weiss jemand einen zuverlässigeren weg?
vielen dank, marcel
Moin Marcel,
print "Content-type: image/png\r\n";
print "\r\n";
Das einzige was mir so spontan auffällt, sind die \r\n als Zeilenenden. Ich bin mir nicht sicher, ob hier der Hund begraben sein könnte. Probier doch einfach mal, nur \n für eine neue Zeile auszugeben also:
print "Content-type: image/png\n\n"; # Das zweite print ist hier gleich mit drin
ich habe versucht, durch veränderung der variable $CHUNK-SIZE
einfluss darauf zu nehmen, scheint aber immer noch nicht zu 100% zu funktionieren.
CHUNK-SIZE sollte eigentlich KEINE Änderungen auf Browserseite bewirken, da ja letzten Endes das gesamte Bild als Datenstrom gesendet wird ...
Gruß,
Jörk
hallo leute
1)ausganssituation: der browser zeigt mir am anfang ein normales bild an.
2)drücke ich im browser auf die taste "zeige bild", so öffne ich ein .png-bild auf dem server mit folgender perl routine:
(dieses bild wird dann an den platz des ursprungsbild geöffnet usw..)$PIC_PNG_NAME = 'bild.png';
$CHUNK_SIZE = 3000;
open( PIC_PNG, "<$PIC_PNG_NAME" )
or die( "Can't open $PIC_PNG_NAME: $!\n" );
print "Content-type: image/png\r\n";
print "\r\n";
binmode( PIC_PNG );
binmode( STDOUT );
while ( read( PIC_PNG, $data, $CHUNK_SIZE ) ) {
print $data;
}
close( PIC_PNG );komisch ist nun, dass dies nur zu etwa 75% vom browser korrekt angezeigt wird.
in den fehlerhaften fällen passiert manchmal etwas merkwürdiges:
IE: manchmal öffnet er das bild, bevor der ladeprozess abgeschlossen ist, und zeigt dann dieses "fehlerbild",
auch wenn der ladevorgang abgeschlossen ist.
Netscape:manchmal wird das aktuelle bild nicht angezeigt, durch einen erneuten aufruf der perl funktion wird
das bild aber sofort angezeigt, ohne überhaupt noch etwas runterzuladen (d.h. muss schon irgendwo vorhanden sein).hat jemand eine idee was mein problem ist? ich habe versucht, durch veränderung der variable $CHUNK-SIZE
einfluss darauf zu nehmen, scheint aber immer noch nicht zu 100% zu funktionieren.
oder weiss jemand einen zuverlässigeren weg?vielen dank, marcel
ich denk du hast da zwei potentielle probleme: 1. \r\n ist dos-like, sollst durch \n\n ersetzen und die zweite zeile sparen
und 2. solltest du versuchen die content-length mitzuschicken, also das bild in einen string einlesen, und dann den header wie folgt erzeugen:
print "Content-type: image/png\n";
print "Content-length: ".length($imagestring)."\n\n";
print $imagestring;
vor allem der ie ist in manchen fällen scharf auf dieses content-length, sonst erfindet er manchmal irgendwelche komischen zeichen noch dazu.
ok, viel spass denn, gerhard