我有一个Photo模型,其中包含一个图像属性。该图像包含从API获取的base64字符串。我需要运行一个after_create回调函数,并且我想我可以在回调函数中使用Paperclip将图像保存到磁盘上,因为这样可以节省实现公共文件夹中的文件夹结构和生成缩略图的工作量。是否有简单的方法可以实现这一点?
我有一个Photo模型,其中包含一个图像属性。该图像包含从API获取的base64字符串。我需要运行一个after_create回调函数,并且我想我可以在回调函数中使用Paperclip将图像保存到磁盘上,因为这样可以节省实现公共文件夹中的文件夹结构和生成缩略图的工作量。是否有简单的方法可以实现这一点?
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...")
def set_image
self.update({image_attr: "data:image/jpeg;base64," + image_json[PATH_TO_BASE64_DATA]})
end
Paperclip::DataUriAdapter.register
然后,正如@eldi所说,您可以执行以下操作:Photo.new(
image: "data:image/jpeg;base64,#{image_json}",
image_file_name: 'file.jpg' # this way you can provide file_name
)
ActiveModel::UnknownAttributeError (unknown attribute 'image' for Image.):
- jywarrenProcessing by ImagesController#create as */* Parameters: {"authenticity_token"=>"XXX", "data"=>"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAf/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAABgj/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCdABykX//Z"}
- jywarrenPaperclip::DataUriAdapter.register
-- 有什么想法吗? Paperclip 5.2。谢谢! - jywarren@image = Image.new(uid: current_user.uid, image: params[:data], image_file_name: 'dataurl')
- jywarrenhas_attached_file:avatar
无论它是什么,那就是你需要用来提交图像数据的属性。 - Ollie H-Mphoto
而不是image
。更改并推送新的提交 - 希望它能正常工作:https://github.com/publiclab/plots2/pull/3619 - jywarren至少在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
)
另外,在您的控制器中,您不需要更改任何内容:-)(也许您想在params
中接受:image_file_name
)
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模型中使用paperclip保存图像:
Photo.new(image: image).save