我目前有一个视图控制器,用户可以在其中上传图像,该图像存储在Firebase Storage中,其中包含用户id的文件夹以及上传的图像。我想获取该图像的url并将其显示在视图控制器上。我的问题是,我需要将上传的图像的下载url存储到实时数据库中吗;用户->用户Id->媒体->图像标题->下载URL?或者,我有没有办法将图像视图引用到Firebase存储中,并相应地引用到包含所有图像的User Id文件夹中,然后显示它?如果有人能帮我,我将不胜感激。非常感谢。
这是我的代码:
let imageName = (Auth.auth().currentUser?.uid)!+"/(imageTitle.text!)"
let imageReference = Storage.storage().reference().child(MyKeys.imagesFolder).child(imageName)
imageReference.putData(data, metadata: nil) { (metadata, err) in
if let err = err {
print ("Error")
return
}
imageReference.downloadURL(completion: { (url, err) in
if let err = err {
print ("Error")
return
}
guard let url = url else {
print ("Error")
return
}
let dataReference = Firestore.firestore().collection(MyKeys.imagesCollection).document()
let documentUid = dataReference.documentID
let urlString = url.absoluteString
let data = [
MyKeys.uid:documentUid,
MyKeys.imageUrl: urlString,
MyKeys.imageTitle: self.imageTitle.text!,
] as [String : Any]
dataReference.setData(data) { (err) in
if let err = err {
print ("Error")
return
}
}
})
}
从存储读取数据有两种方法:
- 通过Firebase SDK,在引用上调用
getData
或write
,如下载数据的文档中所示 - 通过引用的下载URL,该URL提供公共只读访问
要调用getData
、write
或获取下载URL,您需要有一个对文件的引用,如创建引用中所示。
由于您将文件存储在用户的UID下,因此如果您知道用户的UID,则始终可以为用户创建对任意的的引用。因此,即使您没有存储下载URL,也可以始终执行上面两种方法中的一种来读取文件的数据。
也就是说,将下载URL存储在数据库中是很常见的,因为这意味着你可以像对待任何其他图像URL一样对待它。通过这样做,您的代码的其余部分将不必了解任何有关云存储的信息。
因此:它可以在不将下载URL存储在数据库中的情况下工作,但如果存储下载URL,也很好(而且很常见(。选择真的取决于你。