我想删除文件夹“test”以及其中的所有内容。
我可以使用以下代码通过终端成功删除 FirebaseStorage 中的文件夹及其所有内容/子文件夹:
gsutil rm -r gs://bucketname.appspot.com/test/**
但是,当我尝试在 java 中执行此操作时,它不起作用。
Storage storage = StorageOptions.getDefaultInstance().getService();
String bucketName = "bucketname.appspot.com/test";
Bucket bucket = storage.get(bucketName);
bucket.delete(Bucket.BucketSourceOption.metagenerationMatch());
它抛出这个异常:
Exception in thread "FirebaseDatabaseEventTarget" com.google.cloud.storage.StorageException: Invalid bucket name: 'bucketname.appspot.com/test'
at com.google.cloud.storage.spi.DefaultStorageRpc.translate(DefaultStorageRpc.java:202)
at com.google.cloud.storage.spi.DefaultStorageRpc.get(DefaultStorageRpc.java:322)
at com.google.cloud.storage.StorageImpl$4.call(StorageImpl.java:164)
at com.google.cloud.storage.StorageImpl$4.call(StorageImpl.java:161)
at com.google.cloud.RetryHelper.doRetry(RetryHelper.java:179)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244)
at com.google.cloud.storage.StorageImpl.get(StorageImpl.java:160)
at xxx.backend.server_request.GroupRequestManager.deleteGroupStorage(GroupRequestManager.java:119)
at xxx.backend.server_request.GroupRequestManager.deleteGroup(GroupRequestManager.java:26)
at xxx.backend.server_request.ServerRequestListener.onChildAdded(ServerRequestListener.java:27)
at com.google.firebase.database.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:65)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:49)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:41)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Invalid bucket name: 'bucketname.appspot.com/test'",
"reason" : "invalid"
} ],
"message" : "Invalid bucket name: 'bucketname.appspot.com/test'"
}
那么它不存在吗?因为当我在没有 /test 的情况下运行此代码时:
Storage storage = StorageOptions.getDefaultInstance().getService();
String bucketName = "bucketname.appspot.com";
Bucket bucket = storage.get(bucketName);
bucket.exists(Bucket.BucketSourceOption.metagenerationMatch());
然后存在返回true,没有例外,我能够列出所有的blob..但我想删除“/test”中的所有内容。
编辑:好的,我确实让它像这样工作,但我需要使用迭代器。有更好的解决方案吗?通配符还是什么?
Storage storage = StorageOptions.getDefaultInstance().getService();
String bucketName = "bucketname.appspot.com";
Page<Blob> blobPage = storage.list(bucketName, Storage.BlobListOption.prefix("test/"));
List<BlobId> blobIdList = new LinkedList<>();
for (Blob blob : blobPage.iterateAll()) {
blobIdList.add(blob.getBlobId());
}
storage.delete(blobIdList);