0

我是 Rails 初学者,我尝试为图像 url 添加载波上传,如 railscast 的第 253 集所示。到目前为止,当我插入普通链接时一切正常,例如

http:/.....g/dog-01.jpg

我的问题是我想从一个提供数据的 javascript 插件中检索我的图像:图像输出,你如何在这里看到:

var url = canvas.toDataURL('image/png');
document.getElementById("canvascontent").value = url;

您还可以看到我将数据:图像插入到输入(#canvascontent)。

<%= ff.text_field :remote_name_url, class => "canvascontent" %>

所以现在我的问题是,当我尝试简单地保存来自 text_field 的 data:image 时,这不起作用:remote_name_url,因为它是用 base64 编码的。

好消息是 Ruby 有一个 Base64 编码器。为了对 data:image 进行编码并将其保存在图像文件中(此处为 png),我编写了一个简单的代码,可以从控制台执行该代码:

require 'base64'

data_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB....."
png      = Base64.decode64(data_url['data:image/png;base64,'.length .. -1])
File.open('testal', 'wb') { |f| f.write(png) }

所以要走到最后。我的问题是我不知道如何用 Rails 实现这一点!我知道模型 before_create 有一个“代码”,我尝试过类似的方法,但没有成功。我想是因为我必须先暂时保护图像!

before_create do
require 'base64'
self.remote_name_url = Base64.decode64(remote_name_url['data:image/png;base64,'.length .. -1])
end 

    class Painting < ActiveRecord::Base
    belongs_to :treatment
    attr_accessible :name, :image, :remote_name_url
    mount_uploader :name, BildUploader

    before_create do
require 'base64'
self.remote_name_url =   Base64.decode64(remote_name_url['data:image/png;base64,'.length .. -1])
    end 
    end

<

 class TreatmentsController < ApplicationController
def create
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.create(params[:treatment])
    redirect_to patient_path(@patient)
end
def destroy
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.find(params[:id])
    @treatment.destroy
    redirect_to patient_path(@patient)  
end

结尾

4

1 回答 1

0

Carrierwave wiki 上的这篇文章似乎很有希望:

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Upload-from-a-string-in-Rails-3

还有使用Rack::Test::UploadedFileStringIO对象的旧技术,但在不用于测试环境的代码中看起来更奇怪。

于 2014-02-15T21:52:17.167 回答