読者です 読者をやめる 読者になる 読者になる

Base64形式の画像をRailsで保存できるように変換する

Railsでアプリを作ってる際、Base64に変換された画像をS3に保存するという要件があったので実装してみた。

実装にあたって以下のサイトとかを参考にした。

環境

実装

# lib/base64_converter.rb
module Base64Converter
  def self.to_uploaded(base64_param, filename: )
    content_type, string_data = base64_param.match(/data:(.*?);(?:.*?),(.*)$/).captures
    extention = content_type.split('/').second
    tempfile = Tempfile.new(filename)
    tempfile.binmode
    tempfile << Base64.decode64(string_data)
    tempfile.rewind
    file_param = { filename: [filename, extention].join('.'), type: content_type, tempfile: tempfile }
    ActionDispatch::Http::UploadedFile.new(file_param)
  end
end

気をつけるべきはIO#binmode

Tempfile#binmodeの返り値はselfではなくFileなため、

tempfile = Tempfile.new(filename).binmode

上のようにワンラインで書いてしまったために オブジェクトがガベージコレクションに回収されてしまい結果エラーになるという事象が発生した。

したがってここは

tempfile = Tempfile.new(filename)
tempfile.binmode

こう書いてあげる必要があるぽい。

そんなこんなであとはcontrollerとかで使うだけ。

以上。

参考