2

在 Google App Engine 的常规(非灵活)实例上,您可以使用 Blobstore API 并创建一个 URL 以允许用户将文件直接上传到您的 Blobstore。上传后,您的应用引擎应用程序会收到文件位置通知并可以对其进行处理。python代码的一个例子是:

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

请参阅Blobstore 文档

切换到 Google App Engine 柔性环境后,Blobstore 的使用在很大程度上已被 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 下载文件,因为我认为您不能假设工作人员仍然可以访问存储在实例文件系统中的文件。因此,将文件上传到我的实例而不是直接到它的存储位置,我没有任何好处。

4

2 回答 2

3

我已经开始使用create_resumable_upload_session创建一个签名 URL,我们的客户端应用程序可以将文件上传到该 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 通知。

于 2018-02-15T09:45:11.533 回答
0

使用新的 Google Cloud Storage Client 创建的每个 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 可以让您轻松完成整个过程

于 2017-02-08T10:25:49.320 回答