9

在应用程序引擎中,我可以使用我的应用程序的默认存储桶提供像 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))
4

3 回答 3

11

更新我发现此功能可以使用 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 中的非图像!!

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

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

代码可以在这里找到。

于 2014-03-12T15:15:51.567 回答
4

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

APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'

该文件中的注释对此进行了解释:

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

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

编辑:

这是来自支持论坛:

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

希望有帮助,

马克谷歌云存储团队

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

于 2014-03-04T15:54:13.340 回答
0

我早些时候在这里寻找答案,只是想分享我发现的东西,现在我已经开始工作了。

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

看:

如果您签署您的 URL,您可以为您的内容提供自动过期链接,用于匿名或付费消费。您不希望以这种方式为您的整个网站提供服务,但对于 PDF 或诸如此类的东西,这是一个有效且半安全的选项。

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

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

如果您使用的是 App Engine,GoogleAccessId则为:<projectname> @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

我希望这可以帮助别人!

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

于 2017-06-30T21:58:43.217 回答