【问题标题】:How to serve cloudstorage files using app engine SDK如何使用应用引擎 SDK 提供云存储文件
【发布时间】:2014-04-06 03:53:33
【问题描述】:

在应用引擎中,我可以使用我的应用程序的默认存储桶提供像 pdf 一样的云存储文件:

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

但是如何在 SDK 中提供本地云存储文件,而不使用 blob_key?

我这样写到默认存储桶:

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 中默认存储桶的名称 = 'app_default_bucket'

在 SDK 数据存储中,我有一个种类:GsFileInfo 显示:文件名:/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))

【问题讨论】:

  • SDK中的本地云存储文件是什么意思?
  • 保存在我的 SDK 默认存储桶中的文件。
  • 没有SDK默认bucket。只有您的应用程序有默认存储桶。
  • app_identity.get_default_gcs_bucket_name() 返回 'app_default_bucket'

标签: python google-app-engine sdk google-cloud-storage serving


【解决方案1】:

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

APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'

此文件中的 cmets 解释它:

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

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

编辑:

这是来自支持论坛:

在开发模式下,应用引擎工具模拟 Google Cloud 本地存储服务。该模拟环境中的对象是 非持久性,因此您的应用程序失败,因为所需的对象 本地商店中不存在。如果您首先创建(并且可以选择 写入)您要读取的对象,它应该在开发中正常工作 模式(它对我有用)。当然,生产服务中的对象是 持久性,因此在运行您的 应用处于生产模式(假设对象已经存在)。

希望对你有帮助,

Marc Google 云存储团队

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

【讨论】:

  • 是的,它在生产中运行良好。但是要使用哪个 SDK 链接来提供“app_default_bucket”中的 example.pdf 之类的文件。
  • 感谢您的帮助。但我仍然不明白如何使用它。如何在开发模式下提供文件?
  • 尝试将 .appspot.com 替换为 app_identity.get_default_gcs_bucket_name(),看看是否有效。
  • 我试过了:localhost:8080/app_default_bucket/example.pdf 但它返回 404。
  • 是的。我希望谷歌能提供答案或解决方案。
【解决方案2】:

更新我发现此功能可以使用 SDK 提供云存储文件:

This feature has not been documented yet.

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 中的非图像!!

在 SDK 中,您还需要 blobstore 来读取 blob 并为云存储对象创建服务 url。

我还在 SDK 和 GAE 生产中添加了用于读取、写入和上传 cloudstorage blob 的代码。

代码可以在here找到。

【讨论】:

    【解决方案3】:

    我之前在这里寻找答案,只是想分享我的发现,现在我已经开始工作了。

    你现在可以做到这一点,只是有点痛苦。不支持欺骗图像或 blobstore API,并且似乎不再起作用。

    见:

    如果您在 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 编码,然后是 urlencoded。有关如何完成 URL 的构建,请参阅以下内容。您应该可以使用上面提到的下载主机。

    文档中的示例 URL:

    https://storage.googleapis。 com/example-bucket/cat.jpeg?GoogleAccessId=example@example-project.iam.gservicea ccount.com&Expires=1458238630&Signature=VVUgfqviDCov%2B%2BKnmVOkwBR2olSbId51kSib uQeiH8ucGFyOfAVbH5J%2B5V0gDYIioO2dDGH9Fsj6YdwxWv65HE71VEOEsVPuS8CVb%2BVeeIzmEe8z 7X7o1d%2BcWbPEo4exILQbj3ROM3T2OrkNBU9sbHq0mLbDMhiiQZ3xCaiCQdsrMEdYVvAFggPuPq%2FE QyQZmyJK3ty%2Bmr7kAFW16I9pD11jfBSD1XXjKTJzgd%2FMGSde4Va4J1RtHoX7r5i7YR7Mvf%2Fb17 zlAuGlzVUf%2FzmhLPqtfKinVrcqdlmamMcmLoW8eLG%2B1yYW%2F7tlS2hvqSfCW8eMUUjiHiSWgZLE VIG4Lw%3D%3D

    我希望这对某人有帮助!

    哦,是的,如果您的存储桶不可公开访问(全读),您只需执行所有签名工作。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2018-05-09
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2014-01-19
      相关资源
      最近更新 更多