File クラスを使うと、ストレージの読み書きが発生し、速度が落ちるため、メモリ上だけで処理を行う方針。
File クラスと同じ処理をするため、メソッドを定義する。
class StringFileIO < StringIO def self.create_from_canvas_base64 str return nil if str.nil? head, data = str.split ",", 2 return nil if data.nil? _, mime_type = head.split /:|;/ bin = Base64.decode64 data self.new bin, mime_type end def initialize blob, content_type super(blob) @content_type = content_type self end def original_filename "image" end def content_type @content_type end end
あとは、代入するのみ
class User def image_str= str self.image = StringFileIO.create_from_canvas_base64(str) end end