how to use java to set “ACL” to all files under google storage folder

依然范特西╮ 提交于 2020-01-07 05:25:12

问题


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:


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/".



来源:https://stackoverflow.com/questions/42749778/how-to-use-java-to-set-acl-to-all-files-under-google-storage-folder

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!