Firebase Functions Python删除存储文件遇404错误,求服务端解决方案
解决Python Firebase Functions删除Storage文件的404问题
问题根源
你的代码对Firebase Storage的调用逻辑存在错误,导致路径解析异常,出现多余的o文件夹和prettyPrint=false参数,最终返回404。另外你混淆了Firestore规则与Storage规则,但使用管理员服务账号调用Storage API时会绕过安全规则,因此权限不是核心问题。
修正后的代码实现
方式一:通过文件路径删除
正确的逻辑是先获取存储桶实例,再通过完整文件路径定位文件(Blob),最后执行删除:
import firebase_admin from firebase_admin import credentials, firestore, storage from firebase_functions import firestore_fn # 初始化应用(避免重复初始化,适配函数实例复用机制) cred = credentials.Certificate({your_credentials}) if not firebase_admin._apps: firebase_admin.initialize_app(cred, { "storageBucket": "appname.appspot.com" }) @firestore_fn.on_document_created(document=r"UserDeletes/{id}") def delete_user(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None: if not event.data: return user_id = event.data.get('userid') if not user_id: return # 获取存储桶实例 bucket = storage.bucket() # 定义头像和横幅的完整文件路径 profile_image_path = f'profileImage/profileImage/{user_id}/profileImage' banner_image_path = f'bannerImage/bannerImage/{user_id}/bannerImage' # 删除头像(先检查文件存在性,避免无意义报错) profile_blob = bucket.blob(profile_image_path) if profile_blob.exists(): profile_blob.delete() # 删除横幅 banner_blob = bucket.blob(banner_image_path) if banner_blob.exists(): banner_blob.delete()
方式二:通过文件URL删除(与Flutter客户端逻辑对齐)
如果需要直接用存储文件的URL删除,可以借助google-cloud-storage的Blob.from_string方法解析URL:
from google.cloud.storage.blob import Blob def delete_file_from_url(storage_url): bucket = storage.bucket() # 从Storage URL直接创建Blob实例 blob = Blob.from_string(storage_url, bucket=bucket) if blob.exists(): blob.delete() # 在函数中调用(假设UserDeletes文档存储了文件URL) @firestore_fn.on_document_created(document=r"UserDeletes/{id}") def delete_user(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None: if not event.data: return profile_url = event.data.get('profileImageUrl') banner_url = event.data.get('bannerImageUrl') if profile_url: delete_file_from_url(profile_url) if banner_url: delete_file_from_url(banner_url)
关键修正点
- 存储桶调用错误:原代码中
databasephotos.bucket(file_path)是错误用法,bucket()方法的参数是存储桶名称(初始化已指定可省略),而非文件路径。必须先获取桶实例,再用bucket.blob(file_path)定位文件。 - 路径拼接错误:原代码将文件路径拆分到
bucket()和delete_blob()参数中,导致API错误解析路径,生成多余的o前缀。需将完整文件路径一次性传给blob()方法。 - 健壮性优化:添加
exists()判断,避免因文件已不存在触发不必要的报错。
权限说明
你当前配置的是Firestore规则,与Firebase Storage无关。使用管理员服务账号调用Storage API时,会直接绕过Storage的安全规则,无需额外配置删除权限。若后续遇到权限问题,可检查服务账号是否拥有storage.objects.delete权限(默认管理员凭证已包含该权限)。
内容的提问来源于stack exchange,提问作者Edgar Torres
相关产品推荐
相关产品推荐

