簡體   English   中英

Java Google Cloud Storage API:如何將新上傳的對象設置為公共

[英]Java Google Cloud Storage API: How to set new uploaded objects public

我正在編寫代碼以將可公開訪問的文件上傳到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 Cloud Console中的復選框。 我希望默認選中它。

您使用的gsutil acl ch命令正在設置存儲桶的ACL。 如果要在已經上傳的對象上設置ACL,請嘗試:

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

您使用的gsutil defacl命令應該可以正常工作,但是請注意,上載對象時會應用默認的對象ACL-因此,當您使用此命令時,存儲桶中已經存在的任何對象都將具有先前在值區(預設為專案專用),或是您變更為使用gsutil acl ch的ACL。

我不確定實際上是什么對其進行了更改,以及為什么它現在可以正常工作。 這是我自那時以來所做的事情:

  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) {} 

不知何故做到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM