【Rails4】Dropboxにファイルをアップロードする

環境

Ruby 2.1.5
Rails 4.1.8

目的

  • RailsアプリからDropboxにファイルをアップロードする


0. Dropboxアカウントを取得し、下記からDropboxのアプリを作成する
Login - Dropbox
※キャプチャが少し古いが下記のサイトが参考になる
Dropbox APIをRuby on Railsから叩く方法

1. gem をインストールする。今回はdropbox-apiというgemを使用。bundle installも忘れずに。
※以前にdropbox-sdkを使用した際も比較的簡単に使用できたが、dropbox-apiでより簡単になったと思う。

# Gemfile
gem "dropbox-api"

2. 0で作成したアプリのApp keyとApp secretをRailsに設定する。
※ config/initializers/dropbox.rb を作成して追記。

# config/initializers/dropbox.rb
Dropbox::API::Config.app_key    = "Your App key"
Dropbox::API::Config.app_secret = "Your App secret"
Dropbox::API::Config.mode       = "sandbox" # if you have a single-directory app
# Dropbox::API::Config.mode       = "dropbox" # if your app has access to the whole dropbox
# 今回はRailsアプリからは0で作成したDropboxアプリにしかアクセスしないので"sandbox"を選択した

3. 設定した情報を基に認証画面を表示・承認して、アクセストークンを発行する

# controllers/sample_contoroller.rb
def authorize
    consumer = Dropbox::API::OAuth.consumer(:authorize)
    request_token = consumer.get_request_token
    session[:token] = request_token.token
    session[:token_secret] = request_token.secret
    url = request_token.authorize_url(:oauth_callback => url_for(action: :callback)) # 承認後に呼ばれるURLを指定。4で書くアクション。
    redirect_to url
 end

4. アクセストークンを取得する
※ config/initializers/dropbox.rb を作成して追記。

# controllers/sample_contoroller.rb
def callback
  consumer = Dropbox::API::OAuth.consumer(:authorize)
  hash = { oauth_token: session[:token], oauth_token_secret: session[:token_secret]}
  request_token  = OAuth::RequestToken.from_hash(consumer, hash)
  oauth_verifier = params[:oauth_verifier]
  result = request_token.get_access_token(:oauth_verifier => oauth_verifier)
  
  # 取得したtokenを利用してClientオブジェクトを生成。
  client = Dropbox::API::Client.new :token => result.token, :secret => result.secret
end

5. 実際に動かす
①authorizeのリンクを画面に追加して、押下する
Dropboxの承認画面が表示されるので承認する
③callbackアクションにリダイレクトする
※毎回アップロードするたびにtokenを発行することはないので、callback内でDBに保存する等しておくとよい。