用户可以从我的Google App Enigne应用程序下载csv文件。 较大的文件达到了1分钟的超时窗口,我重新映像了我的解决方案,为用户提供了存储ACL中的读访问权限,并重定向到了下载链接。
这是一个为用户提供访问权限并重定向到“https://storage.cloud.google.com/[bucket]/[object]”的工作示例(1)
storage_client = storage.Client()
bucket = storage_client.get_bucket(app_identity.get_default_gcs_bucket_name())
acl = bucket.acl
acl.user(ndb_user.primaryEmail).grant_read()
acl.save()
self.redirect("https://storage.cloud.google.com" + filename)
似乎我的解决方案不能以编程方式工作,也不能在浏览器中工作。 任何想法为什么或建议替代方法实际这样做?
1:https://cloud.google.com/storage/docs/xml-api/reference-uris
答案 0 :(得分:0)
这不起作用,因为您只通过ACL api授予存储桶的READ访问权限。这映射到IAM角色roles/storage.legacyBucketReader
,该角色不授予storage.objects.get
权限(仅grants storage.buckets.get
和storage.objects.list
)。如果您切换到new IAM api,而是授予roles/storage.objectViewer
这应该有效。
话虽如此,我强烈建议改为Signed URLs。签名URL将通过委派授予临时访问权限,而不是通过ACL永久授予用户访问权限,并且仅针对此用例进行访问。 Google的google-cloud库有一个“generate_signed_url”函数,您可以使用它来生成它们,而不是自己滚动它们。这是documentation。