无法从 python 服务器将图像上传到 Firebase 存储

Posted

技术标签:

【中文标题】无法从 python 服务器将图像上传到 Firebase 存储【英文标题】:Unable to upload image to firebase storage from python server 【发布时间】:2021-03-25 20:14:21 【问题描述】:

我正在创建一个 android 应用程序,它将图像发送到 python 服务器,我想从我的 python 服务器将接收到的图像上传到 firebase 存储。我的问题是,当我尝试从 python 服务器上传接收到的图像时,只有文件名存储在指定的集合中,但我的图像没有上传。我的 Firebase 存储看起来像这样 Firebase storage screenshot

在随附的屏幕截图中,以 Actual 开头的第一张图片是我从 android 上传的图片,第二张以 processed 开头的图片是我尝试从 python 上传但无法上传的图片。文件类型也不同于从android上传的文件类型。下面是我用来从服务器上传图像的代码: 我从android接收图像的功能:

def handle_request():
    print(flask.request.files)
    print(flask.request.form)
    imagefile = flask.request.files['image']
    userID = flask.request.form['user_ID']
    upload_to_firebase(imagefile, filename, userID)

将图像存储到 Firebase 存储的函数。

def upload_to_firebase(file, filename, userID):
    firebase = Firebase(config)
    firebase = pyrebase.initialize_app(config)
    storage = firebase.storage()
    storage.child(userID + "/" + filename + "/Processed_" + filename+"").put(file)
    downloadURL = storage.child(userID + "/" + filename + "/Processed_" + filename+"").get_url(None) 

有什么方法可以在发送图像时传递内容类型 image/jpeg 或任何其他可以解决此问题的方法。我已经搜索了很多这个解决方案,但到目前为止没有一个有效。

【问题讨论】:

【参考方案1】:

请注意,正如Firebase documentation 中所述:

您可以将 Admin SDK 返回的存储桶引用与官方 Google Cloud Storage 客户端库结合使用,以上传、下载和修改与您的 Firebase 项目关联的存储桶中的内容

因此,您需要将您的 upload_to_firebase 函数修改为类似于此处在 Google Cloud Storage client library for Python 的相关部分中解释的内容:

from google.cloud import storage


def upload_blob(bucket_name, source_file_name, destination_blob_name):
    """Uploads a file to the bucket."""
    # bucket_name = "your-bucket-name"
    # source_file_name = "local/path/to/file"
    # destination_blob_name = "storage-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)

    blob.upload_from_filename(source_file_name)

    print(
        "File  uploaded to .".format(
            source_file_name, destination_blob_name
        )
    )

您可以从您使用 Firebase Admin SDK 定义的存储桶对象的 name property 获取 bucket_name 变量(例如,如果您是项目的 using the default bucket):

import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage

cred = credentials.Certificate('path/to/serviceAccountKey.json')
firebase_admin.initialize_app(cred, 
    'storageBucket': '<BUCKET_NAME>.appspot.com'
)

bucket = storage.bucket()

source_file_name 将对应于为您的 Flask 应用程序提供服务的服务器中上传图像的完整路径。

请注意,如果不正确删除或管理上传到 Python 服务器的文件,您最终可能会遇到磁盘空间问题,因此在这方面要小心。

【讨论】:

感谢丹尼尔的帮助。我实现了此代码,并且我的图像存储在所需路径的 firebase 存储中,但只有我首先保存在设备上的图像。如何跳过文件路径部分并直接传递从客户端获取的图像,这样我就不必保存和加载图像。 添加到第一条评论。当我尝试在 firebase 控制台中打开存储的图像时,会出现一个加载器,但它不显示图像。内容类型等属性的其余部分存储良好。 另外,我怎样才能获取图像 url 而不是从 firebase 存储中下载图像? 我发现这个code(还没有测试过)你可以适应你的用例(它使用upload_from_string()而不是upload_from_filename()方法。要获取URL,请利用Blob 的 public_url 属性。

以上是关于无法从 python 服务器将图像上传到 Firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 存储上传图像不适用于亚马逊火灾(型号:Fire 7)

如何上传图片Url上传到Fire Storage并同时保存在fireStore中使用Java

Flutter:Fire Base 存储图像上传的后期初始化错误

从 Fire Storage 检索图像,但是如果图像不存在,则应用程序崩溃

无法在颤动中使用 dio 将图像上传到 api

在 UIButtons 上从服务器加载多个图像?