Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 289
David Yang Liu Avatar asked Feb 07 '12 09:02

David Yang Liu


2 Answers

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}"
like image 127
simonmenke Avatar answered Sep 21 '22 21:09

simonmenke


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.

like image 24
23tux Avatar answered Sep 23 '22 21:09

23tux