如何使用java为goo​​gle storage文件夹下的所有文件设置“ACL”

时间:2017-03-12 16:13:45

标签: java google-cloud-storage gcp

我想要通过GCP更改文件夹中的所有文件,以便公开分享。

我看到如何通过gsutils做到这一点。

我怎么能通过java api做到这一点?

这是我的尝试:

public static void main(String[] args) throws Exception {
        //// more setting up code here...

        GoogleCredential    credential        = GoogleCredential.fromStream(credentialsStream, httpTransport, jsonFactory);
        credential                            = credential.createScoped(StorageScopes.all());

        final Storage storage = new Storage.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName("monkeyduck")
                .build();


        final Storage.Objects.Get getRequest1 = storage.objects().get(bucketName, "sounds/1.0/arabic_test22/1000meters.mp3");
        final StorageObject       object1    = getRequest1.execute();


        System.out.println(object1);

        final List<ObjectAccessControl> aclList = new ArrayList<>();
//        final ObjectAccessControl       acl     = new ObjectAccessControl()
//                .setRole("PUBLIC-READER")
//                .setProjectTeam(new ObjectAccessControl.ProjectTeam().setTeam("viewers"));
        final ObjectAccessControl       acl     = new ObjectAccessControl()
                .setRole("READER").setEntity("allUsers");
        //System.out.println(acl);
        aclList.add(acl);


        object1.setAcl(aclList);

        final Storage.Objects.Insert insertRequest = storage.objects().insert(bucketName, object1);
                insertRequest.getMediaHttpUploader().setDirectUploadEnabled(true);

        insertRequest.execute();
    }
}

我得到了NPE,因为insertRequest.getMediaHttpUploader() == null

1 个答案:

答案 0 :(得分:1)

请尝试使用ACL API

,而不是使用objects().insert()
ObjectAccessControl oac = new ObjectAccessControl()
    oac.setEntity("allUsers")
    oac.setRole("READER");

Insert insert = service.objectAccessControls().insert(bucketName, "sounds/1.0/arabic_test22/1000meters.mp3", oac);
insert.execute();

关于文件夹问题。在云存储中&#34;文件夹&#34;的概念不存在,它只是&#34;桶&#34;和&#34;对象名称&#34;。 您可以看到文件夹在文件夹内的事实(我在谈论云存储浏览器)它只是一个图形表示。使用API​​,您将始终处理&#34;桶&#34;和&#34;对象名称&#34;。

了解这一点,Objects: list提供了一个prefix参数,您可以使用该参数来过滤名称以其开头的所有对象。如果您认为对象名称的开头是文件夹,则此过滤器可以实现您正在寻找的内容。

从我引用的API文档中

  

结合前缀过滤器,使用分隔符   参数允许list方法像目录列表一样操作,   尽管对象命名空间是扁平的。例如,如果分隔符   设置为&#34; /&#34;,然后列出包含该文件的存储桶中的对象   对象&#34; a / b&#34;,&#34; a / c&#34;,&#34; d&#34;,&#34; e&#34;,&#34; e / f&#34 ;将返回物品&#34; d&#34;和   &#34; e&#34;和前缀&#34; a /&#34;和&#34; e /&#34;。