我在从 Firebase 函数中删除 Firebase 存储文件时遇到问题。该代码的目的是在用户决定删除其个人资料后删除个人资料图像和横幅图像。
我对Python的经验很少
这是我的代码
from asyncio.log import logger
import firebase_admin
import firebase_admin.auth
import google.cloud.firestore as t
from firebase_admin import credentials, firestore, auth
import firebase_admin.storage as databasephotos
from firebase_admin import messaging, db
from firebase_functions import firestore_fn
from google.cloud.firestore_v1.base_query import FieldFilter
import asyncio
cred = credentials.Certificate({mycredentials})
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:
adminpass = firebase_admin.auth
database_updates_before_deletion = firestore.client()
databasephotos.bucket(f'profileImage/profileImage/{event.data.get('userid')}').delete_blob('profileImage') #profilepic
databasephotos.bucket(f'bannerImage/bannerImage/{event.data.get('userid')}').delete_blob('bannerImage') #bannerpic
当我执行 Firebase 函数:日志时,此错误出现 DELETE 404 ERROR ../profileImage/profileImage/HZAznUo4cDUmfTSoMoQFPCKYAQi2/o/profileImage?prettyPrint=false: Not Found
我注意到的一件事是文件夹“o”被添加到路径中,并且 PrettyPrint=false 也被添加到路径中。
尝试询问chatgpt,这是chatgpt生成的代码
import firebase_admin
from firebase_admin import credentials, storage
# Initialize the app with a service account, granting admin privileges
cred = credentials.Certificate('path/to/serviceAccountKey.json')
firebase_admin.initialize_app(cred, {
'storageBucket': 'your-project-id.appspot.com'
})
def delete_file_from_firebase(file_path):
# Get a reference to the storage bucket
bucket = storage.bucket()
# Get a blob (file) from the bucket
blob = bucket.blob(file_path)
# Delete the blob (file)
blob.delete()
print(f"File {file_path} deleted successfully.")
# Example usage
file_path = 'path/to/your/file.txt'
delete_file_from_firebase(file_path)
我觉得和我的很相似。
这是我的 Firebase 存储规则
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write : if request.auth != null
}
}
}
我也应该添加允许删除权限吗?
花了几个小时尝试和寻找答案,但似乎没有一个对我有用。
我可以正常添加文件并读取它们,但即使使用管理员凭据也无法删除它们。
更新
我发现的一些不涉及 python 的解决方案涉及使用为 firebasestorage 中的每个文件提供的 url 令牌。
获取url,然后从url中删除。又花了几个小时,没有在python中找到解决方案。它们可以在 Node.js 和 Pyrebase 中使用。
我决定在客户端使用dart和flutter来实现删除
import 'package:firebase_storage/firebase_storage.dart';
FirebaseStorage.instance.refFromURL(userModel.profileImage).delete();
FirebaseStorage.instance.refFromURL(userModel.bannerImage).delete();
在删除内容时,我希望帐户删除完全在服务器端而不是客户端进行。我认为如果某些操作在客户端完成,可能会以某种方式引起问题。
我可能最终会在服务器端使用其他非Python方法来实现删除,但现在我将在用户删除后手动删除它们。但如果有人有 python 解决方案请告诉我!
发现问题了。
所以chatgpt是正确的,我的问题是这行代码
databasephotos.bucket(f'profileImage/profileImage/{event.data.get('userid')}').delete_blob('profileImage') #profilepic
我不得不用这个来代替
databasephotos.bucket().delete_blob(f'profileImage/profileImage/{event.data.get('userid')}/profileImage')
我弄错了方法bucket()。所以当你想引用firebasestorage中的文件时,你必须使用blob(#路径从这里开始)
希望它可以帮助任何在尝试引用文件时犯与我相同错误的人。