从Ruby中的dataURL渲染base64图像并发回图像

时间:2015-08-12 10:40:05

标签: javascript ruby base64 html2canvas

所以我对Ruby真的很陌生,但是我希望得到类似于本教程的内容,我将画布作为base64编码图像传递,然后发回png进行下载。

http://www.intridea.com/blog/2013/1/9/downloadable-svg-in-png-format

我需要为IE9支持这样做,但我无法从上面的教程中获得代码示例,而且我对Ruby的了解不够充分。

这是前端javascript。

pushToServer: ()->
  html2canvas([$(".hidden_container")[0]],{
    onrendered: (canvas)=>
      strDataURI = canvas.toDataURL()
      @temp_container.children().remove()
      @temp_container.hide()

  $.ajax
    url: '/svg/create'
    data: {svg: "#{strDataURI}"}
    dataType: 'json'
    type: 'POST'
    success: (response, status, xhr) =>
      window.location.href = "/downloadable/" + response.id + '.png'
    error: (response, status)=>
      console.log response
})

和红宝石代码

# routes.rb
  match "downloadable/:id(.:format)", :to => 'svg#show'

# svg_controller.rb
class SvgController < ApplicationController
  require "base64"

  def show
    @svg = Svg.where(id: params[:id]).first
    respond_to do |format|
      format.png {
        headers['Content-type'] = 'image/png'
        headers["Content-Disposition"] = "attachment; filename=\"chart.png\""
        @result = Base64.decode64(@svg.content.gsub('data:image/png;base64,', ''))
        render :text => @result
      }
    end
  end
end

对我来说,好像我需要一条红宝石路线来将/ svg / create的初始发布请求路由到某个地方,但我真的不知道该怎么做。

感谢任何帮助。 感谢。

1 个答案:

答案 0 :(得分:1)

您确实需要另一个Action来接收来自Javascript的请求,将其添加到您的路线中:

match "/svg/create", :to => 'svg#show'

我不确定#{strDataURI}究竟是什么,但它必须是base64中的编码画布,解码只发生在show动作上,所以你唯一要做的就是创建检查是否给出了参数svg,用它创建一条新记录:

 def create
   return if not params[:svg]
   svg = Svg.create(content: params[:svg])
   render :json => svg
  end

我不知道你的SVG模型中是否还有其他字段,如果没有,这段代码可能会有效!