为啥我的 Firebase 存储 URL 没有上传到 Google Cloud Firestore?

Posted

技术标签:

【中文标题】为啥我的 Firebase 存储 URL 没有上传到 Google Cloud Firestore?【英文标题】:Why aren't my Firebase Storage URLs uploading to Google Cloud Firestore?为什么我的 Firebase 存储 URL 没有上传到 Google Cloud Firestore? 【发布时间】:2019-12-29 13:20:33 【问题描述】:

我正在尝试允许用户将个人资料照片上传到 Firebase 存储。图片是在我的应用注册过程中上传的。图片正在正确上传到 Firebase 存储,但是下载 URL 没有上传到 Google Cloud Firestore。

我已经尝试将String 类型的变量downloadURL 更改为空的String。这并没有改变结果。

以下是将个人资料照片上传到 Firebase 存储的代码:

func uploadProfilePic() -> String 
     guard let imageData = profilePic?.jpegData(compressionQuality: 0.75) else 
         print("Unable to get image data.")
         return ""
     

     let imageID = UUID().uuidString
     let profilePhotosRef = Storage.storage().reference().child("profilePhotos/\(imageID).jpg")

     let uploadMetadata = StorageMetadata()
     uploadMetadata.contentType = "image/jpeg"

     var downloadURL = String()
     profilePhotosRef.putData(imageData, metadata: uploadMetadata)  (downloadMetadata, err) in
         if let err = err 
             self.showAlertWithOK(title: "An Error Occurred", message: "There was an error uploading your profile photo. Try again later in Hostend settings.")
             print("An error occurred: \(err.localizedDescription)")
         

         profilePhotosRef.downloadURL  (url, err) in
             if let url = url 
                 downloadURL = url.absoluteString
             
         
     

     return downloadURL

以下是将个人资料照片下载 URL 上传到 Cloud Firestore 的代码:

db.collection("users").document(uid).setData(["profile_pic_url": uploadProfilePic(), "name": name, "phone_number": phoneNumber, "fcm_token": token, "timestamp": Date()])

uploadProfilePic() 方法返回一个String

我希望将图片的下载 URL 上传到 Firestore 中的“profile_pic_url”下,但这并没有发生。相反,它只是一个空的String,即使图像已成功传输到 Firebase 存储。

【问题讨论】:

console.log() ed 你的方法返回uploadProfilePic()了吗? 【参考方案1】:

您不能对包含闭包的函数使用 return 语句,因为该函数将在闭包执行之前返回。

改为更改您的函数以使用完成处理程序,例如

func uploadProfilePic(completion: @escaping (String?, Error?) -> ()) 

然后,一旦您获得下载 url,就调用处理程序。

    profilePhotosRef.downloadURL  (url, err) in
      completion(url, err)
    

然后您可以使用此函数来填充您对 Cloud Firestore 的调用,就像这样

   self.uploadProfilePic()  (url, error) in

    guard error....

    if let url = url 
      // do your upload here
    

【讨论】:

以上是关于为啥我的 Firebase 存储 URL 没有上传到 Google Cloud Firestore?的主要内容,如果未能解决你的问题,请参考以下文章

为啥无法使用 Google Firebase 存储中的下载 URL 打开上传的文件?

为啥这不能检索 Firebase 存储上图像的下载 URL?

为啥使用异步函数“getDownloadURL”来获取 Firebase 存储中的文件 URL

为啥我无法将文件上传到 Firebase 存储

Firebase 上传未获取下载 URL

使用 Vuejs 在 Firebase 存储中获取上传文件的 url