[英]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.