在app引擎中,我可以使用我的应用程序的默认存储桶来提供像pdf这样的cloudstorage文件:
http://storage.googleapis.com/<appid>.appspot.com/<file_name>
但是如何在不使用blob_key的情况下在SDK中提供本地cloudstorage文件?
我写这样的默认存储桶:
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 显示:filename:/app_default_bucket/example.pdf
更新和解决方法:您可以获取非图像文件(如css,js和pdf)的服务网址。
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))
答案 0 :(得分:11)
更新我发现此功能使用SDK提供云存储文件:
This feature has not been documented yet.
http://localhost:8080/_ah/gcs/app_default_bucket/filename
这样我们不需要img服务网址来提供NON图像,如下所示!!!
要在default_bucket中为图像,css,js和pdf等云存储文件创建e服务URL,我使用此代码进行测试(SDK)和GAE生成:
重要提示:images.get_serving_url()也适用于SDK中的NON图像!!
在SDK中,您需要使用blobstore读取blob并为cloudstorage对象创建服务URL。
我还在SDK和GAE制作中添加了读取,写入和上传cloudstorage blob的代码。
可以找到代码here。
答案 1 :(得分:4)
这是您在app_identity_stub.py的开发模式中看到的值:
APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'
此文件中的注释解释了它:
此服务与生产服务的行为相同,但使用除外 常量值而不是特定于应用的值
您应该在生产代码中获得正确的网址。
编辑:
这是来自支持论坛:
在开发模式下,应用引擎工具会模拟Google Cloud 本地存储服务。该模拟环境中的对象是 非持久性因此您的应用程序失败,因为所需的对象 在本地商店中不存在。如果您首先创建(并且可选) 写到你想要阅读的对象,它应该在dev中工作正常 模式(它为我做了)。当然,生产服务中的对象是 执行所以在运行你的时候不需要额外的步骤 应用程序处于生产模式(假设对象已存在)。
希望有所帮助,
Marc Google云存储小组
这意味着您必须先写一个文件,然后才能使用它。如果我理解正确,您可以使用任何存储桶名称,包括'app_default_bucket'。
答案 2 :(得分:0)
我之前在这里寻找答案,只是想分享我发现的东西,现在我已经有了它。
你现在可以这样做,而且只是有点痛苦。欺骗图像或blobstore API不受支持,似乎不再有效。
请参阅:
如果您对自己的网址进行了签名,则可以为自己的内容提供自动过期的链接,以供匿名或付费使用。您不希望以这种方式为整个网站提供服务,但对于PDF或诸如此类的东西,这是一个有效且半安全的选项。
缺少文档,您可能需要删除规范扩展标头的换行符。存储端点将告诉您签名错误时的预期结果。
此外,您的主机应为:https://storage-download.googleapis.com/
如果您正在使用App Engine,则GoogleAccessId
为:&lt; projectname&gt; @ 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的构建,请参阅以下内容。您应该可能使用上面提到的下载主机。
来自文档的示例网址:
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
我希望这有助于某人!
哦,是的,如果您的存储桶无法公开访问(全部阅读),您只需要执行所有签名工作。