trouble streaming images with send_data

Hi

I'm doing some server-side graphics with Java2D and I'm trying to
stream the resulting image to the browser using send_data. When I try
to view the image that I streamed, the browser just shows the URL in
the window as a very small image (about .4 kb) when I am using jpeg
format. For png, it tells me that the image has errors and can't load
it.

Here's what I'm doing in the controller:

def sendImage
        biFiltered = BI.new(100, 100, BI::TYPE_INT_RGB)
        big = biFiltered.createGraphics()
        $w = 0
        $h = 0
        begin
        filename = "#{RAILS_ROOT}/public/images/kids.jpg"
        imagefile = java.io.File.new(filename)
        bi = javax.imageio.ImageIO.read(imagefile)
w = bi.getWidth(nil);
                h = bi.getHeight(nil);
                if bi.getType != BI.TYPE_INT_RGB
                        bi2 = BI.new(w, h, BI::TYPE_INT_RGB)
                        big = bi2.createGraphics()
                        $stderr.print "after getting graphics"
                        big.drawImage(biFiltered, 0, 0, nil)
                        bi = b2
                        biFiltered = bi
                end
        rescue
                $stderr.print "Couldn't load file"
        end

        big.drawImage(biFiltered,
java.awt.geom.AffineTransform.getScaleInstance(2, 2), nil)
        os = java.io.ByteArrayOutputStream.new
        begin
                isWritten = javax.imageio.ImageIO.write(biFiltered,
"jpeg", os)
        rescue
                $stderr.print "Couldn't write file"
        end

        if isWritten
           send_data "os.toByteArray", :type => "image/
jpeg", :disposition => "inline", :filename => "scaledkids.jpg"
end
end

And then in the HTML file, I just point to the sendImage action from
an img tag.

Does anyone have advice on this? Should I not use the
ByteArrayOutputSteam. It seems that others have used this without
problems.

Thanks.
JB

Hi
       if isWritten
          send_data "os.toByteArray", :type => "image/
jpeg", :disposition => "inline", :filename => "scaledkids.jpg"

You're just sending the string "os.toByteArray" rather than the actual
image bytes. I haven't the faintest clue what a ByteArrayOutputSteam,
but for it to work with send_date you're going to have to make it look
like a ruby string (which is just a chunk of bytes), i'm sure there's
some jruby cleverness to assist with that sort of thing.

Fred

Thank you, Fred. I will look into the ruby string. And sorry,
everyone, for posting this message twice--accidentally hit send too
soon.

JB

According to the following information, I'd have to do some array
allocation/copying or something like that to write Java output streams
directly to the backing byte array of Ruby strings because this
doesn't seem to have been implemented yet?

http://jira.codehaus.org/browse/JRUBY-929

Could anyone give me a hint on how to perform the workaround?

Thanks

This is just a guess based on 5 minutes of looking at the jruby wiki,
but http://wiki.jruby.org/wiki/Calling_Java_from_JRuby#Ruby_String_to_Java_Bytes_and_back_again
  might be interesting.

Fred