Firebase Firestore iOS:如何将图像保存到Firestore中的集合



所以我有一个应用程序,用户可以在其中向地图添加注释,我希望每个用户都能看到和访问这些创建的注释。我正在尝试将注释数据写入Firestore,但似乎不支持图像。我还尝试将图像转换为base64EncodedString,但随后文档超出了1mb的大小限制。(通常为10毫巴左右(。这是我的代码:

let strBase64UserPickedImage =  image?.pngData()?.base64EncodedString()
let strBase64DefaultImage = UIImage(named: "Image-1")?.pngData()?.base64EncodedString()
// User gave both 'warnings' and 'image' values
if warnings != nil && image != nil {
db.collection("jumpSpotAnnotations").addDocument(data: [
"title": title,
"coordinate": coords,
"estimatedHeight": estimatedHeight,
"locationDescription": locationDescription,
"warnings": warnings!,
"image": strBase64UserPickedImage!
]) { (error) in
if let e = error {
print("There was an issue saving data to firestore: (e)")
} else {
print("Successfully saved data.")
}
}
}

"如果"语句还有更多的部分,但它们都无关紧要。如何在不超过大小限制的情况下保存图像?如果真的不可能用Firestore保存图像,那么firebase还有其他方法吗?请记住,我正在努力使每个用户都可以访问这些注释,无论它是由谁创建的,我并没有试图使userDefault或其他任何东西。谢谢你的帮助!

我将图像数据存储为字符串,然后在我的应用程序中有一个函数,它读取字符串并将其转换为UIImage。要存储数据,您可以使用这样的函数,资产位于xcode项目中:

func storePicIntoFirebase(picName: String) {
let picData = UIImage(named: picName)!.jpegData(compressionQuality: 0.7)!

let picString = picData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
Firestore.firestore().collection(.Images).document(pic).setData(["data":picString])
}

然后在你的应用程序中,你可以获得这个功能的图像:

func imageFromData(pictureData: String, withBlock: (_ image: UIImage?) -> Void) {
var image: UIImage?
let decodedData = NSData(base64Encoded: pictureData, options: NSData.Base64DecodingOptions(rawValue: 0))
image = UIImage(data: decodedData! as Data)
withBlock(image)
}

通常,Firestore不适合像图像这样的大型二进制数据。首选方法是使用Firebase的云存储来存储二进制数据,并使用Firestore将该图像的路径存储在您上传图像的存储桶中。

最新更新