Java Google Cloud Storage API:如何公开新上传的对象

时间:2015-08-15 09:14:49

标签: java google-cloud-storage

我正在编写代码以将可公开访问的文件上传到Google云端存储,但是,它们已上传,但未选中“共享公开”复选框。

我使用以下代码设置我的Google连接:

    log.info("Setting up Google Cloud Storage");

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    List<String> scopes = new ArrayList<>();
    scopes.add(StorageScopes.CLOUD_PLATFORM);

    Credential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId("157264856793-sl14obknv58bi73m2co92oabrara9l8c@developer.gserviceaccount.com")
            .setServiceAccountPrivateKeyFromP12File(resourceLoader.getResource("classpath:google-auth.p12").getFile())
            .setServiceAccountScopes(scopes).build();

    storage = new Storage.Builder(httpTransport, jsonFactory, credential).setApplicationName("nitro-login").build();

    log.info("Google Cloud Storage set up");

然后使用以下代码编写文件:

public void save(String filename, MultipartFile mpf) {

    try {

        log.info("Uploading " + filename + "...");

        InputStreamContent content = new InputStreamContent(mpf.getContentType(), mpf.getInputStream());
        content.setLength(mpf.getSize());
        StorageObject metaData = new StorageObject();
        Storage.Objects.Insert insert = storage.objects().insert("nitro-resources", metaData, content).setName(filename);
        insert.getMediaHttpUploader().setDisableGZipContent(true);
        insert.execute();

        log.info("Uploaded");

    } catch (IOException io) {
        log.error("Crash");

        io.printStackTrace();
    }
}

我尝试了以下内容:

GSUtil的

./gsutil acl ch -u AllUsers:R gs://nitro-resources
./gsutil defacl ch -u AllUsers:R gs://nitro-resources

还在我的mataData对象上调用setACL:

metaData.setAcl(ImmutableList.of(new ObjectAccessControl().setEntity("allUsers").setRole("READER")));

并且还在插入对象中调用setPredefinedAcl。

insert.setPredefinedAcl("publicRead");

有趣的是,最好的结果是我将两个与ACL相关的陈述都删掉了。然后,至少我可以选择手动勾选Google云端控制台中的复选框。我想在默认情况下勾选它。

2 个答案:

答案 0 :(得分:3)

您使用的gsutil acl ch命令是设置存储桶的ACL。如果要在已上载的对象上设置ACL,请尝试:

gsutil -m acl -R ch -u AllUsers:R gs://nitro-resources

您使用的gsutil defacl命令应该可以正常工作,但请注意,在上载对象时应用默认对象ACL - 因此,当您使用此命令时,存在于存储桶中的任何对象都将具有以前的默认ACL设置在存储桶上(默认情况下是项目私有),或者您使用gsutil acl ch更改为的ACL。

答案 1 :(得分:0)

我不确定实际改变了什么,以及为什么它现在正在工作。以下是我做的事情:

  1. 在控制台中禁用HMAC /互操作性密钥。
  2. 重写了代码

    café
  3. 以某种方式做到了。