Rails 画像をダウンロードしてDBに格納する方法

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