how to use java to set “ACL” to all files under go

2019-09-14 18:24发布

I want to change all files in folder over GCP to be publicly shared.

I see how to do this via gsutils.

How can i do this via java api?

Here is my try:

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();
    }
}

I get NPE because insertRequest.getMediaHttpUploader() == null

1条回答
老娘就宠你
2楼-- · 2019-09-14 19:22

Instead of using objects().insert(), try using the ACL API

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();

About the folder matter. In Cloud Storage the concept of "folder" does not exists, it is only "bucket" and "object name". The fact you can see the file grouped inside folders (I'm talking about the Cloud Storage Browser) it is only a graphic representation. With the API you will always handle "bucket" and "object name".

Knowing this, the Objects: list provides a prefix parameter which you can use to filter all the objects where the name starts with it. If you think the start of your object name as the folder, this filter can achieve what you're looking for.

From the documentation of the API I quote

In conjunction with the prefix filter, the use of the delimiter parameter allows the list method to operate like a directory listing, despite the object namespace being flat. For example, if delimiter were set to "/", then listing objects from a bucket that contains the objects "a/b", "a/c", "d", "e", "e/f" would return objects "d" and "e", and prefixes "a/" and "e/".

查看更多
登录 后发表回答