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
でもいけます。