David Yang Liu
David Yang Liu

Reputation: 1170

Sending an image through JSON data

noobie here hope you guys don't mind! Im trying to query my user/id/pictures.json but all it returns are attributes cus i did a generic format.json {render :json => @photo.to_json()}. My question is how can i create and encapsulate the actual data from the images, so my client can turn that data in to an image? And also what do i need to create(attribute wise) besides the path of image(say you only had useless attributes eg: height content_type, description, thumbnail file_name)?

this is what im trying in my index.json.erb so far

}
  <% @photos.each do |photo|%>
   data: <%= StringIO.new(Base64.encode64(photo.public_filename(:large))) %>
  <%end%>
}

i am getting back

{
 data: #<StringIO:0x1058a6cd0>

}

which is not the IMGdata im looking for looking for

Upvotes: 7

Views: 12566

Answers (3)

H.Rabiee
H.Rabiee

Reputation: 4837

It's up to the client how to render it really. This works for me, maybe worth a try.

  render json: @thumbnail, type: :jpeg, content_type: 'image/jpeg'

Upvotes: 0

simonmenke
simonmenke

Reputation: 2880

Have a look at Data-URIs. They essentially are Base64-encoded entities (documents) formatted as a URI

[{ "name":"red dot", "data": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="}, ...]

[UPDATE]

You need to read the file and encode it as Base64 (you also need to strip the newlines away in rails 2.3.x)

data = ActiveSupport::Base64.encode64(File.read("/images/image1.png")).gsub("\n", '')
uri  = "data:image/png;base64,#{data}"

Upvotes: 9

23tux
23tux

Reputation: 14736

I think you are using Ruby on Rails, aren't you?

Then there are some steps needed to download an image (e.g. a png):

Create a mime type

Go to config/initializers/mime_types.rb and insert Mime::Type.register "image/png", :png at the end.

Create an image

For example, you could use the gem Chunky_PNG to create an image, see at http://rubygems.org/gems/chunky_png and https://github.com/wvanbergen/chunky_png/wiki

Prepare your controller

You have to tell your controller, that it can accept pngs. Modify your controller the following way

class UsersController < ApplicationController
  respond_to :json, :png

    def show
        # your own stuff
        # ...

        respond_with(response) do |format|
          format.json
          format.png do
            send_data ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT), :type =>"image/png", :disposition => 'inline'
          end
        end
    end
end

This will create a fully transparent image. If you want to draw something in this, look at the Chunky PNG docs.

Upvotes: 1

Related Questions