Java - 如何删除 google 云中的非空存储桶?

Java - how do I delete a non-empty buckets in google cloud?

我正在尝试删除我的代码中的存储桶,但它仅在存储桶为空时有效。 我的删除码是

com.google.api.services.storage.Storage.Buckets.Delete delete = storage.buckets().delete(bucketName);
        delete.execute();

如果桶不为空,我会收到异常和错误消息,说明桶不为空 我试图在文档中找到一个没有成功的解决方案 here

我以为我可以获得存储桶内容的对象列表,然后开始删除它们,但我找不到这个 API。

您可以使用 com.google.api.services.storage.Storage.Objects.List 列出存储桶中的对象。

谢谢,终于找到了解决方案:

 List<StorageObject> storageObjects = new ArrayList();
    torage.Objects.List listObjects = storage.objects().list(bucket);
    Objects objects = listObjects.execute();
    storageObjects.addAll(objects.getItems());
    for (StorageObject storageObject : workBucketObjects) {
           Storage.Objects.Delete delete = storage.objects().delete(bucketName,storageObject.getName());
           delete.execute();

}

由于 Google 云存储 API 发生了相当大的变化,上述解决方案并不适用于所有设置(例如,您在 Maven 项目中并且您只有权访问 com.google.cloud.storage.* 命名空间。)

所以,我的解决方案是two-fold:(1)遍历所有文件(2)递归删除所有文件(3)删除存储桶本身。

import com.google.cloud.storage.*;

private static void deleteGcsBucket(String projectId, String gcsBucketName) {
  StorageOptions.Builder optionsBuilder = StorageOptions.newBuilder();
  StorageOptions storageOptions = optionsBuilder.setProjectId(projectId).build();
  Storage storage = storageOptions.getService();

  Iterable<Blob> blobs = storage.list(gcsBucketName, 
      Storage.BlobListOption.prefix("")).iterateAll();
  for (Blob blob : blobs) {
    blob.delete(Blob.BlobSourceOption.generationMatch());
  }

  storage.delete(gcsBucketName, 
      Storage.BucketSourceOption.userProject(projectId));
}