in reply to Re: Images built on the fly do not display
in thread Images built on the fly do not display

The image is saved to file and although this snippet doesn't show it, the image filename was manually changed each time the script was run, so the caching problem shouldn't really apply.

We did try to give the give the process ID as the filename.

Yes, I can see how it would be a good idea to send the image directly to the browser but I am curious to know why the current effort doesn't work Here is the full code:

#!/usr/bin/perl -w $|=1; use strict; use CGI::Carp "fatalsToBrowser"; use CGI ":all"; use DBI; print header,start_html(-title=>'Bright', -bgcolor=>'#BDBDB0'); print h1(font{-face=>'Futura Lt BT'}, "Genome view"); print font{-size=>'3', -color=>'#800000', -face=>'Futura Lt BT'}; my($tth,$sth,$dbh,@position,$start,$finish,@row,$i,$child_pid,@accessi +on,$SQLstr,$imagename); if(!param) { $dbh = DBI->connect("DBI:mysql:database=dicty;host=localhost", "** +**", "****"); $sth=$dbh->prepare("select min(fstart),max(fstop) from fdata"); $sth->execute; while(@row=$sth->fetchrow_array) { $position[0]=$row[0]; $position[1]=$row[1]; } $dbh->disconnect; print start_form; print textfield(-name=>'start',-value=>$position[0],-size=>15),br, textfield(-name=>'finish',-value=>$position[1],-size=>15); print submit(-name=>'submit'),end_form; } if(param("submit")) { $imagename=$$; $start=param("start"); $finish=param("finish"); if(!defined($child_pid=fork())) { die "cannot fork $!"; } elsif($child_pid==0) { my $query= "/usr/apache/cgi-bin/order/ldasdump.pl -png -d dict +y chr5.1:$start,$finish --user root --pass mysqladmin > /usr/apache/h +tdocs/imagename.png"; exec($query); } else { waitpid($child_pid,0); print img({src=>"../../imagename.png",align=>'LEFT'}); } }

Replies are listed 'Best First'.
Re: Re: Re: Images built on the fly do not display
by dws (Chancellor) on Jan 08, 2003 at 11:53 UTC
    I am curious to know why the current effort doesn't work

    The problems start with this line   print header,start_html(-title=>'Bright', -bgcolor=>'#BDBDB0'); which sends a MIME type of "text/html" back to the browser, then starts an HTML page. At this point, it's a bit late to start printing image bits and expect the browser to display an image.

    Read the description of header() in the CGI.pm POD, and note how to override the MIME type (aka Content-type). You want to send "image/png".

    I should have given up and gone to bed hours ago.

    Is it possible that there's something in $start or $finish that is fouling up the shell meta-character expansion that happens when you use the single-argument form of exec(), preventing the command from generating an image?

    Try using the list form of exec(), which doesn't trigger shell meta-character expansion.

      Nonono, you've missed how it is supposed to work. This script invokes an external script to produce an image and save it to a temporary file. This script sends out an HTML which contains a link to this temporary file as an URL for an IMG tag. The browser is supposed to pick up the HTML and load the image in it.

      To the OP: perhaps the time difference between the saving of the file and sending the URL to the browser is too short. Perhaps the server hasn't finished saving when the webserver tries to access the file. I don't know, it's just a wild guess, really.

        yep, but wouldn't the fork,exec and waitpid() be the answer to the server trying to access the file before the saving has finished?

        We did try just looping for 30secs or so before the print img statement in order to give it some extra time

      mmm, i don't think there is something wrong with $start or $finish because an image is being generated.

      We can display the previously generated images, just never the one that is produced in the current run