Python下载Firebase Storage文件夹遇AttributeError报错求解
报错根因
AttributeError: 'Storage' object has no attribute 'bucket' 是因为你混用了两套SDK的API:pyrebase封装的Storage类本身没有暴露list_files()方法,你参考的旧教程把pyrebase的接口和Google官方Cloud Storage SDK的接口搞混了,直接在pyrebase的storage实例上调用不存在的方法就会触发这个属性错误。
你原有代码另外两个容易触发失败的问题:
- 没有提前创建本地存储下载文件的
data目录,会触发路径不存在异常 - 没有过滤文件夹占位对象、硬编码所有文件后缀为png,会导致下载的文件格式损坏、拉取到非目标路径的文件
修复方案
- 先替换依赖,原版pyrebase已经停更很久,用维护中的pyrebase4分支,同时安装官方Cloud Storage依赖:
pip uninstall -y pyrebase pip install pyrebase4 google-cloud-storage
- 替换成下面的可运行代码,核心是通过pyrebase的storage实例拿到原生GCS的bucket对象,再用官方SDK的列表方法拉取指定路径的文件:
import os import pyrebase # 本地存储目录,提前创建避免路径报错 save_dir = "data" os.makedirs(save_dir, exist_ok=True) # 替换为你自己的Firebase项目配置 config = { "apiKey": "", "authDomain": "", "projectId": "", "databaseURL": "", "storageBucket": "", # 注意不要带gs://前缀,填 项目ID.appspot.com 即可 "messagingSenderId": "", "appId": "", } firebase = pyrebase.initialize_app(config) storage = firebase.storage() # 获取原生GCS bucket实例,这一步才能调用列表、批量操作接口 bucket = storage.bucket # 拉取images目录下的所有文件,delimiter='/'表示不遍历嵌套子文件夹 target_path_prefix = "images/" file_blobs = bucket.list_blobs(prefix=target_path_prefix, delimiter='/') count = 1 for blob in file_blobs: # 跳过文件夹本身的占位对象 if blob.name.endswith("/"): continue try: print(f"下载文件: {blob.name}") # 自动识别文件后缀,避免硬编码png导致格式错误 file_ext = os.path.splitext(blob.name)[1] save_path = os.path.join(save_dir, f"{count}{file_ext}") blob.download_to_filename(save_path) count += 1 except Exception as e: print(f"文件 {blob.name} 下载失败,错误信息: {str(e)}")
注意事项
- 如果需要下载images目录下所有嵌套子文件夹里的图片,删掉
list_blobs里的delimiter='/'参数即可 - 运行前确认Firebase Storage的安全规则开放了对应路径的读取权限,本地测试可以临时设置为公开读取,正式环境记得加回鉴权校验
- 如果配置里的
storageBucket填错,会触发bucket不存在的报错,直接去Firebase控制台Storage页面复制初始存储桶地址即可
内容的提问来源于stack exchange,提问作者Kiên Lư
相关产品推荐
相关产品推荐

