当前位置: 首页 > 知识库问答 >
问题:

Google云存储create\u upload\u url--应用引擎灵活的Python

孙朝明
2023-03-14

在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的使用在很大程度上已被云存储所取代。在这种情况下,是否存在与创建上传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费用。有更好的方法吗?

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

共有2个答案

谈灵均
2023-03-14

使用新的Google云存储客户端创建的每个blob都有一个public\u 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。我不确定这是否是在代码中自己处理的问题。如果您当前的方法有问题,您可能希望考虑在客户端进行上传,而不通过应用程序引擎传递文件。GCS有一个REST API,云存储客户端在下面使用它,因此如果更方便的话,您可以在客户端直接读取并上传文件到GCS。这里有消防基地。谷歌。com/docs/storage/web/upload文件,让您轻松完成整个过程

常波
2023-03-14

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

 类似资料:
  • 问题内容: 我无法在Google Container Engine中使用“应用程序默认凭据”。这些文档说,它们是为App Engine和Compute Engine设计的,但是有人告诉我,它们应该透明地传递给在Container Engine上运行的容器。 这是失败的代码: 失败的错误: 期望Application Default Credentials与Container Engine一起使用是

  • Google API客户端库 Google云存储客户端库 Google云存储API Google Cloud Storage JSON API Java客户端库 我仍然不知道每一个都是做什么的,我不知道如何在我的android客户端中实现云存储。 如果我使用云存储,为什么我需要应用引擎后端应用?我的后端不需要API,对吗?我可以使用Google Cloud Storage JSON API直接消耗

  • 如何将App Engine功能与灵活环境(以前的托管VM)一起使用? 例如,我的旧应用程序使用图像API。如何在Fleixble环境中使用该API? App Engine中的功能列表:https://cloud.google.com/appengine/docs/about-the-standard-environment 图像API:https://cloud.google.com/appeng

  • 具体到基于Docker的部署,这两者之间有什么区别?由于Google App Engine Flexible现在也支持基于Dockerfile的部署,而且它也是完全管理的服务,所以它似乎比在Container Engine上配置Kubernetes部署更可取,不是吗? 有哪些用例更倾向于使用Google容器引擎而不是灵活的应用引擎?

  • 我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...