使用Google云端存储从Firebase存储中删除文件夹 [英] Delete Folder from Firebase Storage using Google Cloud Storage

查看:214
本文介绍了使用Google云端存储从Firebase存储中删除文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我已经可以删除文件夹以及FirebaseStorage中的所有内容/子文件夹终端使用这个代码:

$ pre $ g $ g $ g $ g $ r $ r $ g $://bucketname.appspot.com/test/**



然而,当我试图在java中这样做,它不起作用。

$ p $ Storage storage = StorageOptions.getDefaultInstance ().getService();
String bucketName =bucketname.appspot.com/test;
Bucket bucket = storage.get(bucketName);
bucket.delete(Bucket.BucketSourceOption.metagenerationMatch());

它抛出这个异常:

<$ p $线程FirebaseDatabaseEventTarget中的异常com.google.cloud.storage.StorageException:无效的存储桶名称:'bucketname.appspot.com/test'
,位于com.google.cloud.storage。 spi.DefaultStorageRpc.translate(DefaultStorageRpc.java:202)
,com.google.cloud.storage.spi.DefaultStorageRpc.get(DefaultStorageRpc.java:322)
,com.google.cloud.storage。 StorageImpl $ 4.call(StorageImpl.java:164)
在com.google.cloud.storage.StorageImpl $ 4.call(StorageImpl.java:161)
在com.google.cloud.RetryHelper.doRetry RetryHelper.java:179)
,位于com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244)
,位于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(GroupRequestManage r.java:26)
at xxx.backend.server_request.ServerRequestListener.onChildAdded(ServerRequestListener.java:27)
at com.google.firebase.database.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java: 65)
,位于com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:49)
位于com.google.firebase.database.core.view.EventRaiser $ 1.run (EventRaiser.java:41)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)$ b $在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617 )
在java.lang.Thread.run(Thread.java:745)
引起:com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误请求
{
code:400,
errors:[{
domain:global,
message:无效的存储桶名称:'bucketname.appspot.com / test',
reason:invalid
}],
message:无效的桶名称:'bucketname.appspot.c om / test'
}

那么它不存在吗?因为当我运行这个代码没有/测试:

  Storage storage = StorageOptions.getDefaultInstance()。getService(); 
String bucketName =bucketname.appspot.com;
Bucket bucket = storage.get(bucketName);
bucket.exists(Bucket.BucketSourceOption.metagenerationMatch());

然后存在返回true,没有例外,我可以列出所有的斑点..但我想删除/ test中的所有内容。

编辑:好的,我确实得到了它的工作,但我需要使用一个迭代器。有更好的解决方案吗?通配符还是什么?

  Storage storage = StorageOptions.getDefaultInstance()。getService(); 
String bucketName =bucketname.appspot.com;
页< Blob> blobPage = storage.list(bucketName,Storage.BlobListOption.prefix(test /));
列表< BlobId> blobIdList = new LinkedList<>();
(Blob blob:blobPage.iterateAll()){
blobIdList.add(blob.getBlobId());
}
storage.delete(blobIdList);


解决方案

存储桶是容纳数据的基本容器。您有一个名为bucketname.appspot.com的存储桶。 bucketname.appspot.com/test是您的存储桶名称加上一个文件夹,所以它不是您的存储桶的有效名称。通过调用 bucket.delete(...),您只能删除整个存储桶,但无法删除存储桶中的文件夹。使用 GcsService 删除文件或文件夹。

  String bucketName =bucketname .appspot.com的; 
GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
gcsService.delete(new GcsFilename(bucketName,test));


I want to delete the folder "test" and everything that is in it.

I am sucessfuly able to delete the folder and all it's contents/subfolders in FirebaseStorage with the terminal using this code:

gsutil rm -r gs://bucketname.appspot.com/test/**

However when I tried to do it in java, it does not work.

    Storage storage = StorageOptions.getDefaultInstance().getService();
    String bucketName = "bucketname.appspot.com/test";
    Bucket bucket = storage.get(bucketName);
    bucket.delete(Bucket.BucketSourceOption.metagenerationMatch());

It throws this exception:

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'"
}

So then it does not exist? because when I run this code without /test:

    Storage storage = StorageOptions.getDefaultInstance().getService();
    String bucketName = "bucketname.appspot.com";
    Bucket bucket = storage.get(bucketName);
    bucket.exists(Bucket.BucketSourceOption.metagenerationMatch());

then exists returns true, no exception and I am able to list all the blobs.. But I want to delete all that is inside "/test".

Edit: Okay, I did get it to work like this, but I need to use a iterator. Is there a better solution? A wildcard or something?

    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);

解决方案

Buckets are the basic containers that hold your data. You have a bucket with name "bucketname.appspot.com". "bucketname.appspot.com/test" is your bucket name plus a folder, so its not a valid name of your bucket. By calling bucket.delete(...) you can delete only the whole bucket, but you cannot delete a folder in a bucket. Use GcsService to delete files or folders.

String bucketName = "bucketname.appspot.com";
GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
gcsService.delete(new GcsFilename(bucketName, "test"));

这篇关于使用Google云端存储从Firebase存储中删除文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆