我目前正在研究在GAE上运行的应用程序,该应用程序将接受图像上传,然后将其写入可存储的GCS客户端库(之前使用的Cloud Storage API具有相同的结果)。我看到的问题是,在编写完成后,只有在您已使用Google帐户登录时才能访问这些文件。我已启用结算功能,并且我的GAE ID(XXXXXX@appspot.gserviceaccount.com)作为团队成员作为所有者添加到Google API项目中
我使用了命令:gsutil setdefacl public-read gs://mybucket
(实时代码中的存储桶名称正确)。
我的ACL中有以下条目:
<Entry>
<Scope type="AllUsers"/>
<Permission>
READ
</Permission>
</Entry>
我正在使用以下代码初始化写入:
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);
应用程序会将文件的网址返回给客户端,正如我所提到的,对于任何Google用户都可以正常工作,但任何其他用户在尝试访问https://storage.cloud.google.com/mybucket/filename.png网址时都会被重定向。此外,当我登录云存储Web界面时,当我在“共享公共”列(其中有一个破折号)中移动框时,我收到一条悬停消息“您无权查看或编辑此对象ACL的”。但是我可以毫无问题地删除该文件,并且我登录的帐户被设置为API项目的所有者。
我确信我在这里很容易丢失一些东西,但是我已经完成了所有的文档,并且已经在这里工作了几天。任何见解都表示赞赏。
答案 0 :(得分:5)
云存储用户界面使用storage.cloud.google.com
域,只能以登录用户身份访问。它不是API端点。您应该使用https://storage.googleapis.com/bucketname/objectname
或https://bucketname.storage.googleapis.com/objectname
。
只有对象上有FULL_CONTROL
的用户或对象的所有者才能查看对象的ACL。听起来这个对象属于您的服务帐户,并且您的帐户在该对象上没有FULL_CONTROL
,因此无法查看ACL。您仍然可以删除该对象,因为存储桶上FULL_CONTROL
的用户始终可以删除存储桶中的对象。
答案 1 :(得分:0)
相关说明:我认为您可以通过直接使用blobstore API将图像上传到GCS来降低CPU成本。 https://developers.google.com/appengine/docs/java/blobstore/#using-blobstore-with-gcs