[英]Google Cloud storage Java XML API file upload and mark uploaded file public
[英]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。
我不確定實際上是什么對其進行了更改,以及為什么它現在可以正常工作。 這是我自那時以來所做的事情:
重寫代碼
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.