Posted at

【Rails】メモリ上の画像をそのままcarrierwaveに渡す

More than 1 year has passed since last update.

carrierwaveは、Railsアプリケーションで、画像ファイルをアップロードなどを助けてくれるツールとしてとてもポピュラーです。

https://github.com/carrierwaveuploader/carrierwave

CarrierWave + Rails 5.1で画像アップローダー

Rails 超お手軽な画像アップローダー CarrierWave の使い方

コード上で作成した画像をそのまま、carrierwaveに渡す方法をメモとして残しておきます。

1年ほど前に書いたものなので、今のバージョンではできるようになっているかもしれませんね。


実装方法

まず、StringIOクラスを継承したCarrierStringIOクラスを作ります。

class CarrierStringIO < StringIO

def initialize(*args)
super(*args[2..-1])
@filepath = args[0]
@content_type = args[1]
end

def original_filename
@filepath
end

def content_type
@content_type
end
end

そして、お決まりでmount_uploader を設定しますが、モデルのimage_dataに代入されたらCarrierStringIOクラスを自身のimageに代入するようにします。

これ、もっといい方法があるかもしれませんが、私の脳みそじゃこれぐらいしかできません。

class Hoge < ActiveRecord::Base

mount_uploader :image, ImageUploader

def image_data=(data)
content_type = "image/png"
io = CarrierStringIO.new("title.png", content_type, data)
self.image = io
end
end


結果


  • これでできるようになります

  • もっといい方法あれば教えてください