在应用程序引擎中,我可以使用应用程序的默认存储桶来提供类似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
我希望这能帮助到别人!
哦,是的,如果你的水桶不能公开访问(全部阅读),你只需要做所有的签名。