Google app engine 上载的文件不可通过ACL集公开读取

Google app engine 上载的文件不可通过ACL集公开读取,google-app-engine,google-cloud-storage,Google App Engine,Google Cloud Storage,我目前正在开发一个运行在GAE上的应用程序,该程序将接受图像上传,然后使用GCS客户端库将其写入CAN存储(以前使用的云存储API具有相同的结果)。我看到的问题是,在它被编写之后,只有当你已经使用谷歌帐户登录时,这些文件才可以访问。我已启用计费和我的GAE id(XXXXXX@appspot.gserviceaccount.com)作为团队成员作为所有者添加到Google API项目中 我使用了以下命令:gsutil setdefacl public read gs://mybucket(Buc

我目前正在开发一个运行在GAE上的应用程序,该程序将接受图像上传,然后使用GCS客户端库将其写入CAN存储(以前使用的云存储API具有相同的结果)。我看到的问题是,在它被编写之后,只有当你已经使用谷歌帐户登录时,这些文件才可以访问。我已启用计费和我的GAE id(XXXXXX@appspot.gserviceaccount.com)作为团队成员作为所有者添加到Google API项目中

我使用了以下命令:
gsutil setdefacl public read gs://mybucket
(Bucket名称在实时代码中是正确的)

我的ACL中有以下条目:

<Entry>
  <Scope type="AllUsers"/>
    <Permission>
      READ
  </Permission>
</Entry>
该应用程序将文件的url返回到客户端,正如我所提到的,这对任何Google用户都适用,但当其他用户尝试访问url时,会重定向。此外,当我登录到云存储web界面时,当我将鼠标悬停在“共享公共”列(其中有一个破折号)中的框上时,我会收到一条悬停消息“您无权查看或编辑此对象的ACL”。但是,我可以毫无问题地删除该文件,并且我登录的帐户被设置为API项目的所有者

我肯定我错过了一些简单的东西,但是我已经看了所有的文档,并且已经为此工作了几天。任何见解都值得赞赏

公开阅读问题 云存储用户界面使用
storage.cloud.google.com
域,该用户界面只能作为登录用户访问。它不是API端点。您应该使用
https://storage.googleapis.com/bucketname/objectname
https://bucketname.storage.googleapis.com/objectname

编辑ACL的权限被拒绝
只有对对象拥有
完全控制权的用户或对象的所有者才能查看对象的ACL。听起来该对象属于您的服务帐户,而您的帐户对该对象没有
完全控制权
,因此无法查看ACL。您仍然可以删除该对象,因为对bucket拥有
完全控制权的用户始终能够删除bucket中的对象。

相关说明:我认为您可以通过直接使用blobstore API将图像上载到GCS来降低CPU成本。

能否发布其中一个文件的结果ACL。还请注意,您可以通过GAE将文件直接上载到云存储。请参阅。当我尝试通过gsutil检查ACL时,我得到以下信息:
$./gsutil getacl gs://mybucket/e7b2b0f2-d378-11e2-aa17-60b97f511988.png GSResponseError:status=403,code=AccessDenied,reason=Forbidden,detail=tclvpics/e7b2b0f2-d378-11e2-aa17-60b97f511988.png。这似乎很奇怪,因为我是这个API项目的所有者,我甚至重新运行了gsutil配置来再次检查我是否是正确的用户我需要类似任务的帮助,你能不能检查一下魔兽世界,我不敢相信我错过了。非常感谢,就这样。但是根据GCS文档,“项目所有者和项目编写者组对该对象拥有完全控制权限。”因此用户“我登录的帐户设置为API项目的所有者。”应该可以访问ACL。对吗?仅当ACL是project private的某个子集时。例如,如果用户A上载了一个具有预定义ACL“private”的对象,则作为BUCKET所有者的用户B将能够删除该对象,但无法查看该对象或该对象的ACL。
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename filename = new GcsFilename(bucket, fileName);
GcsFileOptions options = new GcsFileOptions.Builder()
  .mimeType(mime)
  .acl("public-read").build();
GcsOutputChannel writeChannel = gcsService.createOrReplace(filename, options);