RubyでGoogle Driveにファイルをアップロードする

こんにちは。スタメンでバックエンドエンジニアをしております、永井です。 入社して半年ほど経ちますが、任される業務の幅や深さが広がっていき、毎日わくわくしながら働いています。

この前、Rubyで生成したファイルを直接、RubyのGem 「google-drive-ruby」を使用して、社内で使っているGoogle Driveにフォルダ指定してアップロード(ダウンロード)する方法を勉強しました。 今回はその詳しい内容と方法を紹介したいと思います。

目次

google-drive-ruby」とは?

google-drive-ruby」とは、Google Driveにあるファイルやスプレッドシートに対して、書き込みや読み込みを行ったり、ファイルをアップロードしたりすることができる、RubyのGemです。 公式ドキュメントはこちらです。

Google Driveの設定

google-drive-ruby」を使って、Google Driveにファイルをアップロードするには、アップロード先のGoogle Driveから認証情報を取得しなければいけません。

ログインをするための認証情報には、「OAuth クライアント ID」と「サービス アカウント キー」の2種類がありますが、前者の「OAuth クライアント ID」を使用した認証方法は、手動で認証ボタンをクリックする必要があります。そのため、capybaraやwheneverを使った自動化処理、定期処理には向きません。今回はRubyの方で自動化処理をしたかったため、後者の「サービス アカウント キー」を使用して、Google Driveへログインします。

ちなみにサービスアカウントとは、人間ではない仮想的なアカウントであり、アプリケーションなどのシステムが使用します。詳しくは公式ドキュメントを御覧ください。

それでは、まずサービスアカウントを作成するところから始めます。

1.  GCP(Google Cloud Platform)にログインします。

2. 左タブの「APIとサービス」から「認証情報」のページに飛びます。

3. 「認証情報を作成」というプルダウンから、「サービス アカウント キー」を選んで、認証情報をダウンロードします。

 

アップロードする前の準備として、認証情報で得たJSONファイル内のprivate_emailというメールアドレスを、アップロードしたいフォルダの共有に加えて、サービスアカウントに権限を付与する必要があります。

1.  アップロード先のフォルダから共有を選択

2. 先程のメールアドレスを入力

これで、アップロード先を指定することができます。

 

google-drive-ruby」でアップロードする

まず、「google-drive-ruby」をインストールします。

Gemfileに以下を記述。

gem 'google_drive'

bundle installを実行。

$ bundle install --path vendor/bundle

これでGemがインストールされました。

ここから、Rubyでアップロードをする処理に移っていきたいと思います。

 

private_key = OpenSSL::PKey::RSA.new(Rails.application.secrets.google_drive_private_key)
client = Signet::OAuth2::Client.new(
  token_credential_uri: Rails.application.secrets.google_drive_token_uri,
  audience: Rails.application.secrets.google_drive_token_uri,
  scope: %w(
    https://www.googleapis.com/auth/drive
    https://docs.google.com/feeds/
    https://docs.googleusercontent.com/
    https://spreadsheets.google.com/feeds/
  ),
  issuer: Rails.application.secrets.google_drive_client_email,
  signing_key: private_key
)
client.fetch_access_token!
GoogleDrive.login_with_oauth(client.access_token)

ここでは、先程ダウンロードした、認証情報が含まれるファイル読み込んで、ログインするまでの処理を行っています。 client.fetch_access_token!ではGoogleサーバーから、アクセストークンを取得してきます。そのアクセストークンをlogin_with_authメソッドの引数に渡して、Google Driveにログインしています。

次に、フォルダを指定してファイルをアップロードしていきたいと思います。

 

# Google Driveにログイン
session = GoogleDrive.login_with_oauth(client.access_token)

# 適当にファイルを作成
file = File.open("test.txt", "w+")

# アップロードしたいフォルダを指定
folder = session.file_by_title("sample_folder")

# ファイルを指定して、sample_forlerにアップロード
folder.upload_from_file(file, "hoge.pdf", convert: false)

ログインした後、まずアップロードする先のフォルダをfile_by_titleでフォルダ名を指定して探します。もし指定したフォルダ名が存在しないければ、nilが返ってきます。

そのフォルダに対して、upload_from_fileメソッドでアップロードを行います。第1引数にアップロードしたいファイル、第2引数に自由なタイトルを指定します。

ちなみに、第3引数にconvert: falseを指定すると、Google Driveへアップロードした後に、Google Driveの方でフォーマットを変更されずに保存されます。

アップロードが完了して、Google Driveの指定のフォルダを見てみると、ちゃんとアップロードされていますね。

ダウンロードも同様に行うことができます。

# Google Driveにログイン
session = GoogleDrive.login_with_oauth(client.access_token)

file = session.file_by_title("test.txt")

# 引数にダウンロード先のパスを指定
file.download_to_file(path)

file = session.file_by_title("test.txt")でダウンロードしたいファイル名を指定します。そして、file.download_to_file(path)でダウンロード処理を実行します。

おわりに

Rubyのgemである「google-drive-ruby」を使えば、簡単に指定のGoogle Driveフォルダにアップロードができました。今回はGoogle Drive APIの知識を深めることができましたが、今後は、その他のG Suiteや、GCPに関する知識も付けていきたいと思います。

最後に、株式会社スタメンでは一緒に働くエンジニアを募集しています。ご興味のある方はぜひエンジニア採用サイトをご覧ください。 CPに関する知識も付けていきたいと思います。

最後に、株式会社スタメンでは一緒に働くエンジニアを募集しています。ご興味のある方はぜひエンジニア採用サイトをご覧ください。