PythonのFlaskからGoogle Storageに画像をアップロードする手順
Python の Flask で画像を Google Storage にアップロードする手順を解説します。まずは google-cloud-storage をあらかじめ仮想環境にインストールしてください。
pip install google-cloud-storage
実際にアップロードするコードは下のようになります。
from google.cloud import storage
@app.route('/upload', methods=['post'])
def upload():
try:
f = request.files.get('image')
p = os.path.join(app.root_path, 'folder/your-Google-service-account.json')
storage_client = storage.Client.from_service_account_json(p)
bucket = storage_client.get_bucket('your_bucket')
blob = bucket.blob('a.jpg')
blob.upload_from_string(f.read(), content_type=f.content_type)
print(blob.public_url)
except Exception as e:
print(e)
これに対応する HTML:
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit">
</form>
Python から Google Storage にアップロードする手順の整理
上のコードを順に説明します。まず Flask の標準的な関数 request.files.get
を使ってアップロードする画像の情報を取得します。
f = request.files.get('image')
f にはファイル名やサイズといった情報が入っています。続いて Google のサーバーにアクセスするためのクライアントを用意します。
p = os.path.join(app.root_path, 'folder/your-Google-service-account.json')
storage_client = storage.Client.from_service_account_json(p)
今回の難しいポイントはここです。Google に限らず、他のクラウドサーバーにアクセスするときも似たような手順をとります。Google の場合はサービスアカウントをあらかじめ用意してください。まだ作っていない場合は、管理画面の「IAM と管理」からサービスアカウントを作り、json ファイルをダウンロードします。この json ファイルは Flask プロジェクトのどこかに入れます。
os.path.join
はパスを結合する Python の関数です。app.root_path
は Flask のインスタンス app
のルートパスです。p には json ファイルのパスが入ります。
ファイルをアップロードするクライアントは storage.Client から作ります。このクライアントを使って、下のように画像をアップロードします。
bucket = storage_client.get_bucket('your_bucket')
blob = bucket.blob('a.jpg')
blob.upload_from_string(f.read(), content_type=f.content_type)
your_bucket にはあなたが Google のサーバーで作成したバケットの名前を入れてください。a.jpg はアップロード後のファイル名(またはパス)を入れます。実際のアップロードは upload_from_string で行います。