Google云端存储create_upload_url - App Engine灵活的Python

时间:2017-02-07 10:10:44

标签: python google-app-engine google-cloud-storage app-engine-flexible

在常规(非灵活)Google App Engine实例上,您可以使用Blobstore API并创建一个URL,以允许用户将文件直接上传到Blobstore。上传后,您的应用引擎应用程序会收到有关文件位置的通知,并可以对其进行处理。 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应用程序。然后继续进行类似的事情:

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
)

create_upload_url相比,这似乎是网络负载加倍,因为该文件进入我的应用引擎实例,然后立即被复制出来。因此,上传者将在发生这种情况时等待额外的时间。据推测,我还会为此收取额外的App Engine费用。还有更好的方法吗?

我有工作人员以后处理上传的文件,但我倾向于在他们的代码中再次从Cloud Storage下载文件,因为我不认为你可以假设工人仍然可以访问存储在实例文件系统。因此,如果将文件上传到我的实例而不是直接指向其存储位置,我将无法获益。

2 个答案:

答案 0 :(得分:1)

我已经开始使用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订阅了创建的发布/订阅通知。

答案 1 :(得分:0)

使用新版Google云端存储客户端创建的每个blob都有一个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

-

使用Blobstore,实例中的GAE系统处理程序会处理您传递给创建的上传URL的上传文件。我不确定在你的代码中自己处理它是不是一个问题。如果您当前的方法存在问题,您可能需要考虑执行上载客户端,而不是通过App Engine传递文件。 GCS有一个REST API,云存储客户端在下面使用它,所以如果更方便的话,你可以在客户端直接读取文件并将其上传到GCS。有firebase.google.com/docs/storage/web/upload-files可以帮助您完成整个过程