所以我对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的初始发布请求路由到某个地方,但我真的不知道该怎么做。
感谢任何帮助。 感谢。
答案 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模型中是否还有其他字段,如果没有,这段代码可能会有效!