Avatar billede Swift Praktikant
22. december 2002 - 23:46 Der er 11 kommentarer og
1 løsning

Problemer med at vise billeder med CGI

Hejsa.

Jeg har et .CGI modul der henter data ud fra en RRD database og genererer et PNG billede(graf).
Jeg har lavet en PHP side med et frameset - så man kan bladre frem og tilbage (i tiden i graferne)
På nogle tidsområder bliver billedet genereret ok. Men på andre tidsområder får jeg blot denne fejl:
---FEJL START---
<B>CGI Error</B>
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

‰PNG

---FEJL SLUT---

Hvad FILEN kan der være galt??

Specielt går det galt hvis der vælges et større tidsområde...

Se eks. her:
http://swift.dyndns.dk/cgi_test/
Avatar billede erikjacobsen Ekspert
22. december 2002 - 23:54 #1
Dit cgi-program laver en fejl ... men det er jo umuligt at sige hvorfor.
Er det noget vi kan se koden til - eller eksperimentere lidt med?
Avatar billede Swift Praktikant
23. december 2002 - 00:20 #2
Hent den her:
http://swift.dyndns.dk/cgi_test/dev.zip
( CGI kode + RRD fil )

(Jeg skrev php - men det var et ASP frameset...men det er jo ikke der problemet er)
Avatar billede erikjacobsen Ekspert
23. december 2002 - 01:01 #3
Jeg har kigget kort på det, men kan ikke lige afprøve det lokalt (ingen RRDs.pm), og det er for sent at begynde at lege meget med det.

Men det er jo halvfarligt at fjerne muligheden for udskrift af fejl.
Linien
  #print STDERR $cgi_name."_RRD Error: ", $answer, "\n"
er kommenteret ud, og måske har du ikke det efterfølgende billede
der vises ved fejl. Har du lyst til at lege, så udskift linien med

print "Content-type: text/html\n\n";
print $cgi_name."_RRD Error: ", $answer, "\n"

og se hvad der sker
Avatar billede erikjacobsen Ekspert
23. december 2002 - 01:02 #4
Sæt lige et semikolon til sidst ;)
Avatar billede Swift Praktikant
23. december 2002 - 08:59 #5
Det hjælper NADA!

Der sker ingen RRD fejl...

Men som du kan se bliver der jo genereret et PNG billede - men jeg ved ikke om det går galt på grund af noget byte-stuffing måske ??
CGI'en går jo glat pga. nogle headers... "‰PNG"
Avatar billede Swift Praktikant
23. december 2002 - 09:04 #6
Hvis jeg ændrer så PNG billedet gemmes til HD i stedet for STDOUT går det fint...
print $q->header(-type=>'text/html',-expires=>'+10m',-cache_control=>'no-cache');
#print $q->header(-type=>'image/png',-expires=>'+10m',-cache_control=>'no-cache');
#($averages,$xsize,$ysize) = RRDs::graph( "-", @optionList );
($averages,$xsize,$ysize) = RRDs::graph( "tt.png", @optionList );
print "( $xsize , $ysize )<BR>\n";

Efterfølgende kan jeg åbne et PNG billede der er ok!!
Avatar billede _darkstar_ Nybegynder
23. december 2002 - 10:08 #7
Hvad ligger der så i filen, når du har puttet resultatet i stdout?
Hvis du kan åbne den uden problemer, er der faktisk en fejl, for den skal indeholde de headere, som dit script genererer.

Hvis den ikke gør det, har du alligevel ikke fået dem med.

Iøvrigt kunne jeg godt forestille mig at der kan opstå problemer, hvis du ikek har content-length med. Du bør overveje at finde et passende perl-bibliotek (f. eks. LWP) til at lave et fint CGI-response til dig.
Avatar billede Swift Praktikant
23. december 2002 - 15:46 #8
Ja, PNG filen er fin!
Det mærkelige er at den samme CGI kode skifter mellem at virke fint - og FEJLE. Alt efter hvad der vises i PNG billedet.....??

Det medcontent-length - hvordan beregnes det og sættes ind ?

Kan du forklare lidt mere om LWP ?
Eller kender du evt. en måde at få PHP til at lave RRD udtrækket ?
Avatar billede Swift Praktikant
23. december 2002 - 15:52 #9
Det er højst sandynligt det med LÆNGDEN der fejler.
Jeg ændrere PNG billedet fra 400x200 til 200x100 - og nu opstår der tilsyneladende aldrig problemer!
(Kun hvis jeg vælger en større graf i menuen)
Det er jo også logist at alt efter hvad grafen indeholde - så kan billedet fylde noget mere.

MEN: Hvordan laver man så noget smart med at indstille længden ?
Avatar billede Swift Praktikant
02. januar 2003 - 20:34 #10
Jeg har eksperimentetet lidt.

CGI koden kan FINT køre på en Apache maskine!

På CGI koden på min IIS server virker det dog ikke.
Jeg har også prøvet at lege med content-length - men UDEN held.
Spørgsmålet er om jeg gør det rigtigt.

Er der nogle der har nogle gode forslag ??????
Avatar billede erikjacobsen Ekspert
02. januar 2003 - 20:54 #11
Ja så. Et eksperiment kunne være at gemme billedet
på en fil. Aflæse størrelsen. Lave en korrekt
Content-length, og så sende indholdet af filen
med. Måske ikke den endelige løsning, men det er
rimeligt nemt.
Avatar billede Swift Praktikant
07. april 2003 - 13:50 #12
Jeg har prøvet og prøvet.....men det kan IKKE lade sig gøre at få IIS til at returnere store billeder via .CGI.

Derfor ændrede jeg i koden så der gemmes et TEMP .PNG billeder - som .CGI scriptet så genererer en HTML side med et IMG link til billedet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester