2015-08-15 94 views
1

我正在編寫代碼以將可公開訪問的文件上傳到Google雲端存儲,但是,它們已上傳,但未選中「共享公開」複選框。Java Google雲端存儲API:如何設置新上傳的對象公開

我用下面的代碼來設置我的連接谷歌:

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("[email protected]account.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 

而且還呼籲SETACL我mataData對象:

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

的並且在插入對象還呼籲setPredefinedAcl。

insert.setPredefinedAcl("publicRead"); 

有趣的是,最好的結果是,當我離開這兩個ACL相關的語句了。然後,至少我可以選擇手動勾選Google雲端控制檯中的複選框。我希望它默認打勾。

回答

3

您使用的gsutil acl ch命令是設置存儲區的ACL。如果你想要設置已經被上傳嘗試在對象上的ACL:

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

你使用應該可以正常工作,但要注意的是,當對象被上傳默認對象ACL應用到的gsutil defacl命令 - 所以任何物體當您使用此命令時,存儲區中已經存在的ACL將具有之前在存儲區上設置的默認ACL(默認情況下爲項目專用)或您更改爲使用gsutil acl ch的ACL。

+0

感謝您的回答麥克。我的問題是試圖讓我上傳的對象(新的)公開。出於某種原因,我使用的代碼和gsutil的組合沒有這樣做。我非常感謝您提供的任何幫助。我完全喪失了。 – Spider

+0

蜘蛛 - 運行「gsutil defacl ch -u AllUsers:R gs:// nitro-resources」命令後,請運行「gsutil defacl get gs:// nitro-resources」來仔細檢查它是否有效。 - 您應該看到「實體」授予:「allUsers」,「role」:「READER」。然後嘗試上傳一個對象,然後檢查其ACL(gsutil acl get gs:// nitro-resources/that-object)。你有什麼發現? –

+0

不幸的不是。是的,當我使用最後一個命令時,我看到allUsers角色,但是我上傳的任何對象似乎都是私有的和無主的。 – Spider

0

我不確定究竟是什麼改變了它,爲什麼它現在工作。以下是我做過的事情:

  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("[email protected]account.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) {} 
    

不知該做的。

相關問題