概要
RailsでGoogle Cloud Storage(GCS)を使うとなると、ActiveStorageを使う方法が挙がりますが、ActiveRecordを使わないケース(*1)や、そもそもActiveStorageを導入するのが手間だったりすることがあると思います。
ので、ActiveStorageを使わず比較的手軽にGCSを使う方法を紹介します。
*1…2020年2月時点だと、ActiveRecordにしか対応してないみたいです。ActiveStorage and Mongo #31408
事前準備
- 入門ガイドを参考に、GCSのバケットを作成する。
- Google Cloud Platform のサービスアカウントキーを作成するを参考に、サービスアカウントキーのファイルを取得する。
- google-cloud-storageのライブラリを使うので、gemをインストールする。
サンプルの概要
以下のような処理を想定して、GCS使用部分のサンプルを書きます。
- クライアントからmultipart/form-dataでファイルを受け取る。(ファイルの受信部分はRailsでファイルをアップロードしてpublicディレクトリに保存したあとに表示するを参照のこと)
- GCSにファイルをアップロードする。
- アップロードしたファイルのURLを取得する。
実装サンプル
バケットの取得
Exampleを参考にして、バケットを取得します。また、事前準備で取得したkeyファイルは、configフォルダ配下に配置しているものとします。
require "google/cloud/storage"
module GoogleCloudStorageUtil
def getBucket()
storage = Google::Cloud::Storage.new(
project_id: "GCPのプロジェクトIDを入力",
credentials: "config/test_key.json"
)
storage.bucket "事前準備で作成したバケット名を入力"
end
end
ファイルの確認・削除
アップロードするファイルはパス(フォルダ名+ファイル名)で一意にするので、受け取ったファイル名で既に存在する場合は削除します。
def deleteImageFile(fileName, bucket)
file = bucket.file("test_folder/" + fileName)
if !file.nil?
file.delete
end
end
ファイルの追加
指定したパスにファイルを追加します。multipart/form-dataで受け取った場合は、tempfileで送信します。
def addImageFile(imageFile, fileName, bucket)
# tempfileを送る
bucket.create_file(imageFile.tempfile, "test_folder/" + fileName)
end
参照用URLの取得
アップロードしたファイルをパブリックで参照するためには、期限付きのURLを取得する必要があります。
def getImageUrl(fileName, bucket)
file = bucket.file("test_folder/" + fileName)
if !file.nil?
file.signed_url(method: "GET", expires: 60 * 60 * 24)
else
nil
end
end
参考記事など
google-cloud-storage API documentation
Google Cloud Storageのファイルを指定したファイル名でダウンロードしたい