0

我想通过 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

4

1 回答 1

1

objects().insert()尝试使用 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();

关于文件夹的事情。Cloud Storage中不存在“文件夹”的概念,只有“桶”和“对象名”。事实上,您可以看到分组在文件夹中的文件(我说的是云存储浏览器),这只是一个图形表示。使用 API,您将始终处理“桶”和“对象名称”。

了解这一点后,Objects: 列表提供了一个prefix参数,您可以使用该参数过滤名称以它开头的所有对象。如果您将对象名称的开头视为文件夹,则此过滤器可以实现您要查找的内容。

从我引用的 API 文档中

结合前缀过滤器,使用 delimiter 参数允许 list 方法像目录列表一样操作,尽管对象命名空间是平面的。例如,如果分隔符设置为“/”,则从包含对象“a/b”、“a/c”、“d”、“e”、“e/f”的存储桶中列出对象将返回对象“d”和“e”,以及前缀“a/”和“e/”。

于 2017-03-12T18:48:11.177 回答