Используйте скрепку для сохранения изображений base64, полученных из api

У меня есть фотомодель с атрибутом изображения. Изображение содержит строку base64, полученную из api. Мне нужно запустить обратный вызов after_create, и я думал, что могу использовать Paperclip для сохранения изображения на диск в обратном вызове, поскольку это сэкономит мне некоторую работу по реализации структуры папок в общей папке и созданию эскизов. Есть ли простой способ сделать это?

Ответ 1

Чтобы ответить на мой собственный вопрос, вот что я придумал:

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..." )

Ответ 2

ваш set_image должен выглядеть примерно так:

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

Ответ 3

По крайней мере, с помощью программы Paperclip 5 вы можете использовать строку base64 с форматом data:image/jpeg;base64,#{base64_encoded_file}

Для модели вам будет

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)

Ответ 4

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 в Фотомодели