如何使用python从Google firebase存储中删除图像文件

问题描述 投票:0回答:2

我目前正在创建一个Web应用程序(Flask),用户可以登录并将照片上传到Google Firebase。在代码中的某一时刻,我最初将用户上传的照片保存到本地文件夹,但部署后无法正常工作,因此我决定将其临时存储在 Google Storage 中,分析其中的面部,然后将其删除。但是,由于某种原因,我无法从 Google 存储中删除它。

Firebase 初始化:

import pyrebase
from pyrebase.pyrebase import storage 
import firebase_admin
from firebase_admin import storage, credentials

firebase = pyrebase.initialize_app(json.load(open('firebase/firebaseConfig.json')))
auth = firebase.auth()
db = firebase.database()                                    
storage = firebase.storage()

我之前不需要删除存储中的照片,但我可以存储图像并检索其下载 URL,如下所示。我确信该图像存储在我的 Google 存储中,并且当我尝试

storage.delete()

时尝试失败
try:
   storage.child("images/temp/" + filename).put(image, userIdToken)
   current_app.logger.info("[UPLOAD-IMAGE] Photo saved, grabbing url")
   imageURL = storage.child("images/temp/" + filename).get_url(None)

   anazlyzeInfo = recognize.facialRecognition(imageURL)

   delete_temp_image_path = "images/temp/" + filename
   #storage.delete(imageURL) # same error happens when URL is passed
   storage.delete(delete_temp_image_path)

异常中描述的错误是:

'Storage' object has no attribute 'bucket'

我研究了一段时间并尝试了其他解决方案,例如StorageRef 并遇到错误

'Storage' has no attribute 'ref'

我还尝试了Google Admin SDK设置后的服务帐户,但现在我不知道该怎么做:

cred = credentials.Certificate(json.load(open('firebase/fiddl-dev-firebase-adminsdk-stuffdnsnfsnfk.json')))
admin = firebase_admin.initialize_app(cred)

我尝试使用它一段时间,但我不知道可以用

admin
调用什么。

我尝试的两个修复中的任何一个是否走在正确的道路上?我之前对 Firebase 的使用水平相当低,我认为删除也是一样的。谢谢!

python firebase flask google-cloud-storage pyrebase
2个回答
3
投票

我是OP,我解决了我的问题!这篇GitHub帖子帮助我了解到,当出现“存储”没有“存储桶”错误时,您需要“将服务帐户添加到配置中”。

为此,我遵循了 Firebase 管理文档,该文档非常简单。

但是我需要进行两个主要修复。我使用这篇 Stackoverflow 帖子作为指导修复了这个问题。

第一个是为我的应用程序添加我上面缺少的存储桶。

admin = firebase_admin.initialize_app(cred, {
      'storageBucket': 'fiddl-dev.appspot.com'})

第二个问题是,当我尝试在同一篇 [Stackoverflow] 帖子中看到的

bucket = storage.bucket()
时,我收到了存储没有属性存储桶的错误。我找不到任何相关内容,这就是我发这篇文章的原因。

在我的 file.py 顶部导入:

import pyrebase
from pyrebase.pyrebase import storage  
import firebase_admin
from firebase_admin import storage as admin_storage, credentials, firestore

关键是我添加了

import storage as admin_storage
而不是我拥有的
import storage
。本质上,我导入了一个名为 storage 的模块两次,它变得很混乱。

通过最后的更改,我现在可以测试以下代码,该代码从指定的 Google Firebase 存储中的文件路径中删除了图像。

bucket = admin_storage.bucket()
blob = bucket.blob('images/temp/pumpkin.jpg')
print(blob)
blob.delete()

0
投票

就我而言,我错误地将公共 URL (

blob.public_url
) 放在
bucket.blob(...)
作为参数。但是当与 Firebase Storage 交互时,我们只需要相对路径(例如
"images/folder1/"
)。我们一定要注意这些小细节。

© www.soinside.com 2019 - 2024. All rights reserved.