2015-07-11 141 views
0

我有使用Java創建的GAE應用程序。我有一個文件夾和文件桶,我試圖將其複製到同一個項目中的另一個存儲桶中。 我的桶的文件夾結構如下:無法使用Google Cloud Storage JSON API複製文件夾

Bucket_test 
    |-------Folder1/ 
       |-----testtxt1.txt 
    |-------Folder2/ 
       |-----testtxt2.txt 

我試圖複製在使用下面的代碼

String old_bucket = "Bucket_test"; 
String new_bucket = "Bucket_test_new"; 

Bucket isbkt = new GoogleStorageHelper() 
.tryCreateBucket(new_bucket, storage); 
Storage.Objects.List listObjects = storage.objects().list(old_bucket); 

Objects objects; 
objects = listObjects.execute(); 

for (StorageObject object 
: objects.getItems()) { 
Storage.Objects.Copy copyObject 
= 
storage.objects() 
.copy(old_bucket, object.getName(), new_bucket, object.getName(), object); 

try { 
System.out.println("Trying to copy over " + object.getName() + " from " + old_bucket + " >>>> " + new_bucket); 
//copy the file over to the new bucket 
Object copyRes = copyObject.execute(); 
System.out.println(copyRes.toString()); 
} 
catch (Exception e) { 
System.out.println("Exception trying to copy over " + object.getName() + " " + e.getLocalizedMessage()); 
    } 

發生了什麼對象? 我得到以下錯誤:

{ 
"code" : 400, 
"errors" : [ { 
"domain" : "global", 
"message" : "Invalid bucket name: 'Bucket_test/Folder1'.", 
"reason" : "invalidParameter", 
"extendedHelp" : "https://developers.google.com/storage/docs/bucketnaming" 
} ], 
"message" : "Invalid bucket name: 'Bucket_test/Folder1'." 
    } 
} 

應該不是發生什麼事?

我期望它複製文件和文件夾,因爲兩者都被認爲是對象。我成功地將文件複製過來,如果它們直接在存儲桶中而不在任何文件夾中。

  1. 是否有另一種方法來複制文件和文件夾?
  2. 我是否需要使用前綴和分隔符列出它們SRC:https://cloud.google.com/storage/docs/json_api/v1/objects/list

回答

0

在雲存儲中,文件夾不被視爲對象。 As stated in the documentation

Because the Google Cloud Storage system has no notion of folders, folders created in the Google Developers Console are a convenience to help you organize objects in a bucket.

所以會發生什麼是,如果你的對象名遵循模式「第1部分/第2部分/第3部分」,那麼瀏覽器會顯示兩個文件夾「第1部分」和「第2部分」,然後一個名爲「一部分」 。但是真正存儲在系統中的只是一個名爲「part1/part2/part3」的文件。

因此,複製文件夾對雲存儲沒有任何意義,因爲文件夾不存在。你可能想要做的是複製文件夾「folder1」內的所有文件。在這種情況下,你將需要:

  • 列出所有的名字對象爲「文件夾1 /」
  • 對於每一個這些對象,發出copy命令啓動

您還可以使用gsutil誰爲你自動化。

+0

我能夠使用setPrefix(「Folder1」)列出所有對象,但仍然出現此錯誤。我甚至嘗試過他們的'重寫'方法,但它似乎給了我同樣的錯誤。有什麼想法嗎? –

+0

@c f。你有這方面的更新嗎?我遇到了同樣的問題,並嘗試了幾種方法,但都無效。 – user2153006

相關問題