如何使用应用程序引擎SDK为云存储文件提供服务



在应用程序引擎中,我可以使用应用程序的默认存储桶来提供类似pdf的云存储文件

http://storage.googleapis.com/<appid>.appspot.com/<file_name>

但是,在不使用blob_key的情况下,如何在SDK中提供本地cloudstorage文件?

我这样写默认的bucket:

gcs_file_name = '/%s/%s' % (app_identity.get_default_gcs_bucket_name(), file_name)
with gcs.open(gcs_file_name, 'w') as f:
f.write(data)

SDK中默认bucket的名称="app_default_bucket">

在SDK数据存储中,我有一个Kind:GsFileInfo显示:filename:/app_default_bucket/example.pdf

更新和解决方法:您可以获得非图像文件(如css、js和pdf)的服务url

gs_file = '/gs/%s/%s/%s' % (app_identity.get_default_gcs_bucket_name(), folder, filename)
serving_url = images.get_serving_url(blobstore.create_gs_key(gs_file))

UPDATE我发现这个功能可以使用SDK为云存储文件提供服务:

此功能尚未记录在案。

http://localhost:8080/_ah/gcs/app_default_bucket/filename

这意味着我们不需要img服务url来提供NON图像,如下所示!!!

为了在default_bucket中为云存储文件(如图像、css、js和pdf)创建服务url,我使用以下代码进行测试(SDK)和GAE生产:

重要提示:images.get_serving_url()也适用于SDK中的NON图像

在SDK中,stll需要blobstore来读取blob并为cloudstorage对象创建服务url。

我还添加了在SDK和GAE产品中读取、写入和上传cloudstorage Blob的代码。

代码可以在这里找到。

这是您在app_identity_stub.py:的开发模式中看到的值

APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'

这个文件中的注释解释了这一点:

此服务的行为与生产服务相同,只是使用常数值而不是应用程序特定值

您应该在生产代码中获得正确的URL。

编辑:

这来自支持论坛:

在开发模式中,应用程序引擎工具模拟谷歌云本地存储服务。模拟环境中的对象是非持久性,因此您的应用程序失败,因为所需的对象本地商店中不存在。如果您首先创建写入)您试图读取的对象,它在dev中应该可以正常工作模式(对我来说确实如此)。当然,生产服务中的对象是坚持不懈,所以在运行您的应用程序处于生产模式(假设对象已经存在)。

希望能有所帮助,

Marc谷歌云存储团队

这意味着你必须先写一个文件,然后才能使用它。如果我理解正确,你可以为此使用任何bucket名称,包括"app_default_bucket"。

我早些时候在这里寻找答案,现在我已经找到了答案,我只想分享我的发现。

你现在可以这样做,这只是有点痛苦。欺骗图像或blobstore API不受支持,似乎不再有效。

参见:

  • https://cloud.google.com/storage/docs/access-control/signed-urls
  • https://cloud.google.com/storage/docs/access-control/create-signed-urls-gsutil

如果您对URL进行签名,您可以为内容提供自动过期的链接,以供匿名或付费消费。你不想以这种方式为整个网站提供服务,但对于PDF或其他内容,这是一个有效且半安全的选项。

文档中缺少,您可能需要删除规范扩展标头的换行符。当签名不正确时,存储端点将告诉您它所期望的内容。

此外,您的主机应该:https://storage-download.googleapis.com/

如果您使用的是App Engine,则GoogleAccessId为:<项目名称>@appspot.gserviceaccount.com

参见:app_identity.get_service_account_name()

如何生成签名的示例:

from google.appengine.api import app_identity

def signFile(path, verb='GET', md5='', contentType='',
expiration=''):
signatureRequest = '{}n{}n{}n{}n{}'.format(
verb, md5, contentType, expiration, path)
return app_identity.sign_blob(signatureRequest)

返回一个(privateKey, binarySignature)的元组。

现在您需要构造URL。签名应该是base64编码的,然后是url编码的。请参阅以下内容以了解如何完成URL的构建。您应该使用上面提到的下载主机。

文档中的示例URL:

https://storage.googleapis.com/example-buck/cat.jpeg?GoogleAccessId=example@example-project.iam.gserviceaaccount.com&Expires=1458238630&Signature=VVUgfqviDCov%2B%2BKnmVOkwBR2olSbId51kSibuQeiH8ucGFyOfAVbH5J%2B5V0gDYIioO2dDGH9Fsj6YdwxWv65HE71VEOEsVPuS8CVb%2VeeIzmEe8z7X7o1d%2BcWbPEo4exILQbj3ROM3T2OrkNBU9sbHq0mLbDMhiiQZ3xCAICQdsrEdYVvAFggPuPq%2FEQyQZmyJK3ty%2Bmr7kAFW16I9pD11jfBSD1XXjKTJzgd%2FMGSd4Va4J1RtHoX7r5i7YR7Mvf%2Fb17zlAuGlzVUf%2FzmhLPqtfKinVrcqdlmamMcmLoW8eLG%2ByYW%2F7tlS2hvqSfCW8eMUUjiHiSWgZLEVIG4Lw%3D%3D

我希望这能帮助到别人!

哦,是的,如果你的水桶不能公开访问(全部阅读),你只需要做所有的签名。

相关内容

  • 没有找到相关文章

最新更新