使用回形针保存从api获取的base64图像

时间:2014-05-15 10:34:04

标签: ruby-on-rails image base64 paperclip

我有一个带有图像属性的Photo模型。该图像包含从api获得的base64字符串。我需要运行一个after_create回调,我想我可以使用Paperclip将图像保存到回调中的磁盘,因为它可以节省我在公共文件夹中实现文件夹结构并生成缩略图的一些工作。有没有一种简单的方法可以做到这一点?

5 个答案:

答案 0 :(得分:17)

要回答我自己的问题,这就是我提出的问题:

class Photo < ActiveRecord::Base

  before_validation :set_image

  has_attached_file :image, styles: { thumb: "x100>" }
  validates_attachment :image, presence: true, content_type: { content_type: ["image/jpeg", "image/jpg"] }, size: { in: 0..10.megabytes }

  def set_image
    StringIO.open(Base64.decode64(image_json)) do |data|
      data.class.class_eval { attr_accessor :original_filename, :content_type }
      data.original_filename = "file.jpg"
      data.content_type = "image/jpeg"
      self.image = data
    end
  end

end

image_json是一个包含实际base64编码图像的文本字段(只是数据部分,例如“/ 9j / 4AAQSkZJRg ...”)

答案 1 :(得分:5)

你的set_image看起来应该是这样的

    def set_image        
       self.update({image_attr: "data:image/jpeg;base64," + image_json[PATH_TO_BASE64_DATA]})
    end

答案 2 :(得分:2)

至少使用Paperclip 5,它开箱即用,你需要提供格式为data:image/jpeg;base64,#{base64_encoded_file}的base64字符串

对于你的模特,它将是

Photo.new(
   image:  "data:image/jpeg;base64,#{image_json}",
   image_file_name: 'file.jpg' # this way you can provide file_name
 )

另外在你的控制器中你不需要改变任何东西:-)(也许​​你想接受:image_file_name中的params

答案 3 :(得分:0)

require 'RMagick'
data = params[:image_text]# code like this  data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q
image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1])
new_file=File.new("somefilename.png", 'wb')
new_file.write(image_data)

使用图像作为文件后     Photo.new(图片:图片)#save useng paperclip in Photo model

答案 4 :(得分:0)

从Paperclip 5.2开始,您需要为Paperclip注册DataUriAdapter以便为您处理base64图像。

在config / initializers / paperclip中: docker run --name web -v .:/code -p 8000:8000 web python manage.py runserver 0.0.0.0:8000

然后,@ eldi说你可以这样做:

Paperclip::DataUriAdapter.register

(参见Paperclip发行说明here