0

Google App Engineの通常の(柔軟性のない)インスタンスでは、Blobstore APIを使用して、ユーザーがBlobstoreに直接ファイルをアップロードできるようにURLを作成できます。アップロードされると、アプリケーションエンジンアプリケーションにファイルの場所が通知され、ファイルの処理が可能になります。 Pythonコードの例は次のとおりです。Google Cloud Storage create_upload_url - App Engine Flexible Python

from google.appengine.ext import blobstore 
upload_url = blobstore.create_upload_url('/upload_photo') 

the Blobstore docsを参照してください。

Google App Engineフレキシブル環境への切り替え、usage of the Blobstore has been largely replaced by Cloud Storage。このような場合、create_upload_urlに相当するのでしょうか?

私の現在の実装では、Python Flaskアプリケーションに標準的なファイルをアップロードします。その後のようなもので進行する:ファイルは私のApp Engineのインスタンスに来て、その後すぐにコピーされているので、それはcreate_upload_urlと比較して、ネットワークの負荷を倍増さのような

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob(blob_name) 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 

これがそうです。したがって、アップローダはこれが起こっている間に余分な時間を待つようになります。おそらく私はこのために余分なApp Engine料金も負うことになるでしょう。より良い方法がありますか?

アップロードしたファイルを後で処理する作業者がいますが、私はクラウドストレージからファイルを再度ダウンロードする傾向があります。インスタンスファイルシステム。したがって、ファイルを格納場所に直接送るのではなく、インスタンスにアップロードすることの利点はありません。

+0

私は2,3日前にhttps://stackoverflow.com/questions/42002013/replacing-blobstore-upload-handler-with-gcs/42002289#42002289に似た質問に答えました。アップロードハンドラを作成するのと同じ方法を使用できます。 – Aaron

+0

Thanks @ Samson、しかし、私は 'google.appengine.ext.blobstore'パッケージはApp Engine Flexible Environmentで利用できないと思います。多分私は間違っていますか? –

+0

@JonGこれについての回答が見つかりましたか? –

答えて

0

create_resumable_upload_sessionを使用して、私たちのクライアント側アプリケーションがファイルをアップロードできる署名付きURLを作成し始めました。ような何か:クライアントが正常に当社のストレージにファイルをアップロードしたとき

gcs = storage.Client() 
bucket = gcs.get_bucket(BUCKET) 
blob = bucket.blob(blob_name) 
signed_url = blob.create_resumable_upload_session(content_type=content_type) 

はその後、私はこのCloud Pub/Sub Notifications for Cloud Storageを使用して作成されたパブ/サブ通知にサブスクライブします。

0

新しいGoogleクラウドストレージクライアントがpublic_url性質を持って作成された各ブロブ:

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob('blob_name') 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 
url = blob.public_url 

- ブロブストア、あなたのインスタンスでGAEシステムハンドラで

は、アップロードされたファイル、あなたの世話をします作成されたアップロードURLに渡します。私はあなたのコードでそれを自分自身で処理する問題であるかどうかは分かりません。現在のアプローチに問題がある場合は、アップロードクライアント側を検討し、App Engineを通じてファイルを渡さないことを検討することをおすすめします。 GCSにはREST APIがあり、クラウドストレージクライアントはその下にそれを使用しているので、クライアント側のGCSに直接読み込んでアップロードすることができます。

+0

ご協力ありがとうございます。あなたのソリューションではまだファイル全体を自分のアプリエンジンインスタンスに送信してからGoogle Cloud Storageに転送する必要があり、途中で料金がかかります。create_upload_urlを使用すると、ユーザーはBlobstoreに直接アップロードします。そのため、アップロードにかかる費用のみが発生します。それは理にかなっていますか? –

+0

ええと、Blobstoreでは、インスタンスのGAEシステムハンドラが、アップロードしたアップロードURLに渡されたアップロードファイルを処理します。私はあなたのコードでそれを自分自身で処理する問題であるかどうかは分かりません。現在の方法に問題がある場合は、アップロードクライアント側を検討することをお勧めします。 GCSにはREST APIがあり、クラウドストレージクライアントはその下にそれを使用しているので、クライアント側のGCSに直接読み込んでアップロードすることができます。プロセスを簡単にするhttps://firebase.google.com/docs/storage/web/upload-filesがあります –

関連する問題