Pythonを使用しFirebaseStorageにファイルをアップロードする

PythonでFirebaseCloudFirestoreを使用するという記事を公開しましたが、今回はPythonを使用しFirebaseStorageにファイルをアップロードしてみます。

ちなみに、Firebaseで新規でプロジェクトを作成すると、自動的に新しい「Storage」のフォルダ、及びフォルダパスが生成されますので、事前に作成する必要はない。

なお、ファイルをアップロードするためには、Firebase AdminSDKのライブラリをインストールする必要があります。

■PC環境

Windows 10 Pro

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■アップロードするファイルを用意する

Pythonを使用しFirebaseStorageにファイルをアップロードしますが、アップロードするファイルを用意します。

今回は「forest.jpg」というjpg形式の画像ファイルを用意しました。この画像は著作権フリーのものを使用しています。なお、画像ファイルが置かれている場所は「C:\Users\user_\test(フォルダパス)」となります。

■ファイルのアップロードの準備(Storageのルール編集)

アップロードするファイルを用意した後に、Storageにファイルをアップロードするための準備をします。Firebaseコンソールの「構築」から「Storage」をクリックします。クリックすると「Storage」のページが表示されますので、「Rules」をクリックします。

■コード

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

■コード(変更後)

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

クリック後、今回はルールを編集し、コードを上記のものに変更する。

■FirebaseStorageにファイルをアップロードする

変更後、FirebaseStorageにファイルをアップロードするスクリプトを書いていきます。

■コード

from firebase_admin import credentials,initialize_app,storage

cred = credentials.Certificate(r"firestoretest-fab60-firebase-adminsdk.json(生成された秘密鍵・JSONファイル)")
initialize_app(cred,{'storageBucket': 'Storageのフォルダパス'})

path = "C:/Users/user_/test/"
filename = "forest.jpg"
bucket = storage.bucket('バケットの名前')
blob = bucket.blob(filename)
blob.upload_from_filename(path + filename)

blob.make_public()

print(blob.public_url)

Firebase Admin SDKのライブラリを呼び出します。initialize_appアプリを初期化します。この時に、「プロジェクトの設定」の「サービスアカウント」で生成した秘密鍵・JSONファイル(認証情報)と、Storageのフォルダパス(gs://firestoretest-***.appspot.com)が必要になります。

pathという変数に、画像ファイルが置かれている場所は「C:\Users\user_\test(フォルダパス)」を格納します。この時、raw文字列を利用するとなぜかパスが認識しないという現象が発生しましたので、スラッシュ(”/”)を使用し、フォルダパスを記述し、渡しています。

filenameという変数には、アップロードするファイルの名前を格納します。

bucketという変数内では、storage.bucket()関数を使用し、ストレージバケットの作成を行いますが、Firebase上でプロジェクトを作成すると、すでにバケットが作成されていますので、「(firestoretest-***.appspot.com)※「gs://」は含めない」(バケットの名前)を引数,パラメータとして渡し、格納します。なお、バケットの名前を渡さないと「ValueError: Bucket names must start and end with a number or letter.」というエラーが発生します。

blobという変数内では、bucket.blob()関数を使用し、引数,パラメータとしてアップロードするファイルの名前(filename変数)を渡し、格納します。

格納後、blob.upload_from_filename()関数を使用し、引数,パラメータとして、path変数とfilename変数を渡します。これでアップロードが行われます。

最後に、blob.make_public()関数で、匿名アクセス(だれでもアクセスOK)を可能にし、blob.public_urlで、アップロードされたファイルの公開(パブリック)URLを、print()関数で出力します。

■実行(検証)

このスクリプトを「firebase_img.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、今回用意した画像ファイルがStorageにアップロードされ、完了後、print()関数で、匿名アクセスが可能な公開(パブリック)URLが出力されました。

出力後、公開(パブリック)URLにアクセスしてみると、今回用意した画像が表示されることが確認できました。

確認後、Firebaseコンソールの「構築」から「Storage」をクリックし、「Storage」を確認すると、画像ファイルがアップロードされていることが確認できました。

コメント

タイトルとURLをコピーしました