【问题标题】:Java Google Cloud Storage API: How to set new uploaded objects publicJava Google Cloud Storage API:如何将新上传的对象设置为公开
【发布时间】:2015-11-08 11:47:48
【问题描述】:

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

我使用以下代码设置我的 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 Cloud Console 中的复选框。我希望它默认勾选。

【问题讨论】:

    标签: java google-cloud-storage


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答迈克。我的问题是试图让我上传的对象(新的)公开。出于某种原因,我正在使用的代码和 gsutil 的组合并没有这样做。我非常感谢您能提供的任何帮助。我完全不知所措。
    • Spider - 在您运行“gsutil defacl ch -u AllUsers:R gs://nitro-resources”命令后,您能否通过运行“gsutil defacl get gs: //nitro-resources" -- 你应该看到一个授权给 "entity": "allUsers", "role": "READER"。然后尝试上传一个对象,然后检查其 ACL (gsutil acl get gs://nitro-resources/that-object)。你发现了什么?
    • 很遗憾没有。是的,当我使用您的最后一个命令时,我看到了 allUsers 角色,但我上传的任何对象似乎都是私有且无主的。
    【解决方案2】:

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

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

      try {
      
          InputStream p12InputSream;
          HttpTransport httpTransport;
          File tempFile;
      
          p12InputSream = resourceLoader.getResource("classpath:google-auth.p12").getInputStream();
          tempFile = File.createTempFile("temp", "temp");
          IOUtils.copy(p12InputSream, new FileOutputStream(tempFile));
      
          httpTransport = GoogleNetHttpTransport.newTrustedTransport();
          JsonFactory jsonFactory = new JacksonFactory();
      
          List<String> scopes = new ArrayList<>();
          scopes.add(StorageScopes.CLOUD_PLATFORM);
          scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL);
      
          Credential credential = new GoogleCredential.Builder()
                  .setTransport(httpTransport)
                  .setJsonFactory(jsonFactory)
                  .setServiceAccountId("157264856793-sl14obknv58bi73m2co92oabrara9l8c@developer.gserviceaccount.com")
                  .setServiceAccountPrivateKeyFromP12File(tempFile)
                  .setServiceAccountScopes(scopes)
                  .build();
      
          storage = new Storage.Builder(httpTransport, jsonFactory, credential).setApplicationName("nitro-login").build();
      
          InputStreamContent content = new InputStreamContent(mpf.getContentType(), mpf.getInputStream());
          StorageObject metaData = new StorageObject().setName(filename);
          Storage.Objects.Insert insert = storage.objects().insert("nitro-resources", metaData, content);
          insert.execute();
      
      catch (Exception ex) {} 
      

    不知怎么做到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多