[ruby] Google Firebase Storageの簡単な使い方


Spark プラン 無料枠 Storage

https://firebase.google.com/pricing

プロジェクトID

バケットID

複数のバケットは持てないので、ここに表示されるドメイン名がそれ(gs://以下)

コードサンプル等

storage
storage = Google::Cloud::Storage.new(project_id: ENV["FIREBASE_PROJECT_ID"])
bucket
bucket = storage.bucket ENV["FIREBASE_STORAGE_BUCKET_ID"]
ファイルの追加
bucket.create_file "/path/to/file" # バケットのルートに置く
bucket.create_file "/path/to/file", "folder/name/file" # バケットのサブフォルダに置く

# metadataを付けて置く(後で説明するpublic_urlで必要になる)
# tokenはぶつからない、推測されにくいものであれば何でも良さそう
require "active_support/all"
bucket.create_file "/path/to/file", metadata: { firebaseStorageDownloadTokens: SecureRandom.uuid }
ファイルの参照
files = bucket.files # 全部

# Signature: find_files(prefix:?, delimiter:?, token:?, max:?, versions:?)
# 例 a/b/c_d_e.jpg というファイルがあった場合、
# bucket.find_files prefix: "a/b/c_" で見つけられる path.start_with? 的な
files = bucket.find_files prefix: "folder/sub/prefix"

file = bucket.file("path/to/file") # 直接ファイル1つ
更新
bucket.create_file "/path/to/file1", "folder/sub/file" 
bucket.create_file "/path/to/file2", "folder/sub/file"  # 同じところに同じ名前で置く
削除
file.delete
誰でもアクセスできるURL
file.signed_url # => デフォルトで5分間の公開が可能
file.signed_url expires: 1.hour.to_i # => 1時間の公開が可能、最大で7日間

Signed URL example

X-Goog-Expires: The length of time the signed URL remained valid, measured in seconds from the value in X-Goog-Date. In this example the Signed URL expires in 15 minutes. The longest expiration value is 604800 seconds (7 days).

誰でもアクセスできるURL(永続的)
def public_url(file)
  # more like permanent
  URI(
    "https://firebasestorage.googleapis.com/v0/b/#{CGI.escape file.bucket}/o/#{CGI.escape file.name}",
  ).tap do |uri|

    uri.query = {
      token: file.metadata["firebaseStorageDownloadTokens"],
      alt: :media,
    }.to_query
  end
end

firebaseStorageDownloadTokensがここで必要になるので、ファイルを置く時にmetadataの指定が必要になる。
(javascriptからだとアップロードしたファイルのdownloadUrlがメソッドとして提供されているが、rubyだとまだない?)

Qiita
How to Access and Download Files in Cloud Storage