57
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Railsで、画像をアップロード、ダウンロードするREST API

たくさんの方が書かれてる内容ではありますが、備忘録として書いておきますネ
RESTfulじゃない!とかRails wayじゃない!とか是非ツッコミください。

特に追加するgemは無いです。

Model

画像データとstringのタグを持つImage Modelを作ります。

$ rails g model Image tag:string data:binary
$ rake db:migrate

Routes

こんな感じのルートを定義してみました。
dataは空のままPOSTして、その後Request Bodyにバイナリを直接突っ込んでPUTでアップロードするという使い方です。

routes.rb
get 'images/:id' => 'images#show'
post 'images' => 'images#create'

get 'images/:id/download' => 'images#download'
put 'images/:id/upload' => 'images#upload'

Controller

$ rails g controller Images
images_controller.rb
class ImagesController < ApplicationController
  def show
    image = Image.find(params[:id])
    render json: image, except: [:data]
  end

  def create
    image = Image.new
    image.tag = params[:tag]
    image.save!
    render json: image, except: [:data]
  end

  def download
    image = Image.find(params[:id])
    send_data image.data, type: "image/png", disposition: 'inline'
  end

  def upload
    image = Image.find(params[:id])
    image.data = request.raw_post
    image.save!
    render json: image, except: [:data]
  end
end

curlで試す

$ rails s
$ curl --request POST -H 'Content-Type: application/json' -d '{"tag":"trumpet"}' http://localhost:3000/images
$ curl --request PUT -H 'Content-Type: application/octet-stream' --data-binary "@icon.png" http://localhost:3000/images/1/upload
$ curl http://localhost:3000/images/1/download > icon_downloaded.png

さすがrails, お手軽です。
REST APIのバックエンド作るだけならもっとシンプルなsinatraとか使った方が良いかもしれませんが・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
57
Help us understand the problem. What are the problem?