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

Google Cloud Storage create_upload_url -- App Engine Flexible Python

在 Google App Engine 的常规(非灵活)实例上,您可以使用 Blobstore API 并创建一个 URL 以允许用户直接上传文件进入您的 Blobstore。上传后,您的 App Engine 应用程序会收到文件位置的通知并可以对其进行处理。 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 费用。有没有更好的方法?

我有工作人员稍后处理上传的文件,但我倾向于在他们的代码中再次从云存储下载文件,因为我认为您不能假设工作人员仍然可以访问存储在实例文件系统。因此,将文件上传到我的实例而不是直接存储到它的存储位置对我没有任何好处。

使用新 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有一个RESTAPI,云存储客户端在下面使用它,如果方便的话可以直接在客户端读取文件上传到GCS。 firebase.google.com/docs/storage/web/upload-files 可以帮助您轻松完成整个过程

我已经开始使用 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 创建的 Pub/Sub 通知。