繁体   English   中英

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')

请参阅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下载文件,因为我认为您不能认为工作人员仍然可以访问实例文件系统中存储的文件。 因此,将文件上传到我的实例而不是直接发送到其存储位置并没有任何好处。

我已经开始使用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 Storage的Cloud Pub / Sub Notifications订阅创建的发布/订阅通知

使用新的Google Cloud Storage客户端创建的每个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系统处理程序会处理传递给创建的上传网址的上传文件。 我不确定在代码中自行处理是否有问题。 如果您当前的方法有问题,则可能要考虑进行上传客户端,而不要完全通过App Engine传递文件。 GCS具有REST API,并且云存储客户端在下面使用它,因此,如果方便的话,您可以将文件直接读取并上传到客户端的GCS。 有firebase.google.com/docs/storage/web/upload-files可以帮助您轻松完成此过程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM