繁体   English   中英

从 Flutter 中的 Firebase 云存储中删除文件夹

[英]Deleting a folder from Firebase Cloud Storage in Flutter

我有一个 Flutter 移动应用程序,我正在尝试从 Firebase 云存储中删除一个文件夹(及其内容)。 我的方法如下:

deleteFromFirebaseStorage() async {
     return await FirebaseStorage.instance.ref().child('Parent folder/Child folder').delete();
}

我希望删除Child folder及其内容,但会引发此异常:

未处理的异常:PlatformException(错误 -13010,FIRStorageErrorDomain,Object 父文件夹/子文件夹不存在。)

但是我可以清楚地看到该文件夹存在于 Cloud Storage 中。 如何删除此文件夹?

Cloud Storage 实际上没有任何文件夹。 只有看起来像文件夹的路径,以帮助您考虑如何构建数据。 每个 object 只能有一个通用前缀来描述其在存储桶中的“虚拟位置”。

Firebase SDK 没有公开任何操作,可以轻松删除这些常用前缀之一中的所有对象。 您唯一真正的选择是以公共前缀列出所有文件,迭代结果,然后单独删除每个 object。

不幸的是,列表文件 API还没有进入 flutter,如此所述。 因此,就简单的解决方案而言,您有点不走运。 另请参阅: FirebaseStorage:如何删除目录

您的主要可行选择是:

医学博士。 Saffan Alvy 是对的,但是要完全删除所有文件而不是一个文件,请执行此操作。 如果你不知道。

await await FirebaseStorage.instance.ref("users/${FirebaseAuth.instance.currentUser!.uid}/media").listAll().then((value) {
value.items.forEach((element) {
FirebaseStorage.instance.ref(element.fullPath).delete();
);
});

目前,我正在开发一个项目,该项目在每个文件夹中都包含一个文件,所以我这样做了,它对我有用。

await FirebaseStorage.instance.ref("path/" + to + "/" + folder)
                  .listAll().then((value) {
FirebaseStorage.instance.ref(value.items.first.fullPath).delete();
});

此代码也会删除文件和文件夹。 由于此处没有文件夹,因此删除文件会删除文件夹或引用。 如果您有多个文件,您可以使用 foreach 循环或 map 从文件夹中删除所有内容。

我构建了一个脚本,它递归地删除文件夹和所有子文件夹中的所有文件,这里是:

import 'package:firebase_storage/firebase_storage.dart';

class FirebaseStorageApi {

  static Future<void> deleteFolder({
    required String path
  }) async {
    List<String> paths = [];
    paths = await _deleteFolder(path, paths);
    for (String path in paths) {
      await FirebaseStorage.instance.ref().child(path).delete();
    }
  }

  static Future<List<String>> _deleteFolder(String folder, List<String> paths) async {
    ListResult list = await FirebaseStorage.instance.ref().child(folder).listAll();
    List<Reference> items = list.items;
    List<Reference> prefixes = list.prefixes;
    for (Reference item in items) {
      paths.add(item.fullPath);
    }
    for (Reference subfolder in prefixes) {
      paths = await _deleteFolder(subfolder.fullPath, paths);
    }
    return paths;
  }

}

用法:

await FirebaseStorageApi.deleteFolder(path: "YOUR/FOLDER/PATH");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM