Railsでopen-uriを使ってダウンロードした画像をデータベース(以下、DB)に格納する方法です。
step1. 画像用のモデルを作る。
Imageモデルを作ります。
class Image < ApplicationRecord end
マイグレーションは次のような感じで、binary型の画像データをカラムに持つようにします。
create_table :images do |t| t.string :name # 画像の名前 t.binary :data # 画像データ end
step2. 画像をダウンロードする。
画像をダウンロードはopen-uriを使うと簡単です。
例として架空のURLであるhttp://example.com/example.jpgを対象としてダウンロードし、image変数に格納します。
require "open-uri"image = open("http://example.com/example.jpg")
step3. 画像をDBに格納する。
step2でダウンロードした画像をImageモデルに保存します。
readで画像データを取り出して、dataカラムに格納しています。create!で作成と同時に保存します。
Image.create!( name: "hello data: image.read )
これでDBに画像が格納されました。
使い方
BDに保存した画像をブラウザで表示してみます。
単純にImage.dataの値をブラウザで表示するというわけには行かず、次のステップを踏みます。
step1. URLを割り当てる。
画像データを取得するためのルーティングを設定します。
ここでは、http://ドメイン/image/ にアクセスがあったときに画像を返すようにしてみます。
routes.rbを開き、/imageへアクセスがあったときにapiコントローラのimageアクションが呼ばれるようにルーティングを追加します。
get 'image', to: 'api#image'
step2. DBに格納した画像を返す。
DBに格納した画像を返すには、send_dataメソッドを使ってブラウザが読めるように画像データを生成します。
apiコントローラに次のように記述します。例なのでImageモデルの先頭レコードの画像データを返しています。
class ApiController < ApplicationController def image send_data( Image.first.data, :type => 'image/jpeg', :disposition => 'inline' ) end end
これで、ブラウザでhttp://ドメイン/imageにアクセスすると、画像データが返ってきます。
http://ドメイン/image.jpgでもいけます。