如何在Flutter中列出Firebase Storage内所有路径、目录与文件
解决方案
Firebase Storage 调用 listAll() 后返回的 ListResult 包含两部分内容:
items:当前目录下的所有文件引用prefixes:当前目录下的所有子文件夹引用
你只需要递归遍历所有prefixes对应的子文件夹,把所有层级的文件收集起来即可实现全量遍历。
完整修改后的代码
class DownloadFirebaseApi { // 对外暴露的方法,直接遍历存储桶根目录下所有文件 static Future<List<FirebaseFile>> listAll() async { final rootRef = FirebaseStorage.instance.ref(); return _recursiveListFiles(rootRef); } // 私有递归遍历方法,接收指定目录的Reference,返回该目录及所有子目录下的全部文件 static Future<List<FirebaseFile>> _recursiveListFiles(Reference ref) async { List<FirebaseFile> allFiles = []; final result = await ref.listAll(); // 先处理当前目录下的所有文件 final currentDirUrls = await _getDownloadLinks(result.items); for (int i = 0; i < result.items.length; i++) { final fileRef = result.items[i]; allFiles.add(FirebaseFile( name: fileRef.name, url: currentDirUrls[i], ref: fileRef, // 可选:补充完整存储路径,方便后续本地存储时创建对应目录结构 // fullPath: fileRef.fullPath )); } // 递归遍历当前目录下的所有子文件夹 for (final prefix in result.prefixes) { final subDirFiles = await _recursiveListFiles(prefix); allFiles.addAll(subDirFiles); } return allFiles; } static Future<List<String>> _getDownloadLinks(List<Reference> refs) async { return Future.wait(refs.map((ref) => ref.getDownloadURL()).toList()); } }
注意事项
- 如果你的存储桶内文件数量极大,建议加加载状态提示,避免用户误以为程序卡住
- 请提前配置好 Firebase Storage 的访问规则,确保你有权限读取所有需要遍历的路径,否则会触发权限异常
- 每个文件的
Reference.fullPath属性会返回文件在存储桶内的完整路径(例如MainFolder/Folder2/Folder3/file.json),你可以在FirebaseFile类中补充该字段,方便下载到本地时按照原目录结构存储文件
内容的提问来源于stack exchange,提问作者ThomasG2201
相关产品推荐
相关产品推荐

