基本 Jinja

PythonのFlaskからGoogle Storageに画像をアップロードする手順

最終更新日 2019.12.08

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 で行います。