You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:36:04