我正在跟进这指南并提出解决方案,即使用签名的 URL 和 XML REST API(例如)将对象上传到 Google Cloud 存储。curl -v -X POST $URL -F "[email protected]"
不幸的是,我不知道如何在这些对象上设置 ACL,以便它们公开可见。我尝试使用x-goog-acl
标头(以及签名 URL 和请求标头中的各种大写字母)和acl
查询参数,但没有成功。
我认为这一定是可能的,因为它在 API 文档中被引用,并且所有客户端库都允许您这样做。我感觉我的 URL 签名方法搞砸了(即使标头出现在签名的 URL 中:)https://storage.googleapis.com/foo/test.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=STUFF&X-Goog-SignedHeaders=host%3Bx-goog-acl&acl=public-read&MORE-STUFF
,但我有点不知所措。
答案1
如果我理解正确的话,您希望使用 XML REST API 上传您的对象,并且希望任何人都可以公开访问该对象。
为此,您可以按照指示上传您的对象。要使用文件而不是数据二进制文件,只需将其替换--data-binary @[OBJECT]
为-T [PATH_TO_FILE]
。完成此操作后,要将对象公开,您需要按照这些步骤这样做将使您的对象始终可供任何人访问,并且您不需要将签名的 URL 用于其他任何操作。
另一方面,如果你想要授予任何人在有限时间内访问某个对象的权限,那么你需要生成该权限签名的 URL,这就是您提到的指南所做的。
编辑
我认为我已经让它按照你想要的方式工作了。首先,你需要修改教程中的代码,添加另一个查询参数:
query_parameters['X-Goog-Acl'] = 'public-read'
现在,您可以使用所需的参数运行 Python 代码(使用方法PUT
),并使用带有签名 URL 的另一个 PUT,如下所示:
curl -v -X PUT $SIGNED_URL -T "[PATH_TO_FILE]" -H "content-type:text/plain" -H "x-goog-acl:public-read"
在我的示例中,我正在创建签名的 URL 来上传纯文本文件。
我已广泛尝试过并且它有效。