Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

serving an image with dancer and GD

by gideondsouza (Pilgrim)
on Jul 31, 2013 at 18:13 UTC ( #1047300=perlquestion: print w/ replies, xml ) Need Help??
gideondsouza has asked for the wisdom of the Perl Monks concerning the following question:

So I'm building a perl/dancer app and I want to serve an image at a url like this:

mysite.com/image.png (which will be generated at runtime)

I did this:

get '/image' => sub { # create a new image my $im = new GD::Image(100,100); # allocate some colors my $white = $im->colorAllocate(255,255,255); my $black = $im->colorAllocate(0,0,0); my $red = $im->colorAllocate(255,0,0); my $blue = $im->colorAllocate(0,0,255); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); content_type 'image/png'; binmode STDOUT;#don't think this makes a diff. send_file($im->png); };
But, I end up getting a broken image and 400 BAD request in the network log. Any ideas? I tried putting it all in a eval, no errors there.

Comment on serving an image with dancer and GD
Download Code
Re: serving an image with dancer and GD
by Corion (Pope) on Jul 31, 2013 at 18:20 UTC

    send_file wants to send a file, which must exist on disk, with a name, on the server. You maybe just want to return $im->png as the result of the request?

    Also, what is DISPLAY supposed to be/do? I recommend using lexical filehandles over using global filehandles.

Re: serving an image with dancer and GD
by dasgar (Deacon) on Jul 31, 2013 at 22:35 UTC

    You're close to getting it right. The binmode line is not needed and the send_file should just be a return (as Corion had suggested). Below is a copy of your code with these changes.

    get '/image' => sub { # create a new image my $im = new GD::Image(100,100); # allocate some colors my $white = $im->colorAllocate(255,255,255); my $black = $im->colorAllocate(0,0,0); my $red = $im->colorAllocate(255,0,0); my $blue = $im->colorAllocate(0,0,255); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); content_type 'image/png'; #binmode STDOUT;#don't think this makes a diff. #send_file($im->png); return $im->png; };

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1047300]
Approved by Loops
Front-paged by sparkyichi
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (6)
As of 2014-09-22 08:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (183 votes), past polls