【问题标题】:Unable to copy folders using Google Cloud Storage JSON API无法使用 Google Cloud Storage JSON API 复制文件夹
【发布时间】:2015-09-29 21:54:12
【问题描述】:

我有一个使用 Java 创建的 GAE 应用程序。我有一个包含文件夹和文件的存储桶,我试图将它们复制到同一项目中的另一个存储桶。 我的bucket的文件夹结构如下:

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 列出它们?

【问题讨论】:

  • @c f.你找到解决办法了吗?

标签: java google-app-engine google-cloud-storage


【解决方案1】:

在 Cloud Storage 中,文件夹不被视为对象。 As stated in the documentation

因为谷歌云存储系统没有文件夹的概念, 在 Google Developers Console 中创建的文件夹便于 帮助您组织存储桶中的对象。

如果您的对象名称遵循“part1/part2/part3”模式,那么浏览器会显示两个文件夹“part1”和“part2”,然后是一个名为“part”的文件。但系统中真正存储的只是一个名为“part1/part2/part3”的文件。

因此,复制文件夹对 Cloud Storage 没有任何意义,因为文件夹不存在。您可能想要做的是复制文件夹“folder1”中的所有文件。在这种情况下,您需要:

  • 列出所有名称以“folder1/”开头的对象
  • 对于每个对象,发出copy 命令

您也可以使用 gsutil 为您自动执行此操作。

【讨论】:

  • 我能够使用 setPrefix("Folder1") 列出所有对象,但我仍然收到此错误。我什至尝试了他们的“重写”方法,但它似乎给了我同样的错误。有什么想法吗?
  • @c f.您对此有任何更新吗?我遇到了同样的问题并尝试了几种方法,但都不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2014-10-25
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多