【问题标题】:How to upload the profile image URL to firebase database如何将个人资料图片 URL 上传到 Firebase 数据库
【发布时间】:2020-06-25 18:51:20
【问题描述】:

当我的用户注册时,他们使用的是直接进入 firebase 的个人资料图片。图像正确上传到 Firebase 存储中,但一旦它出现在数据库中,配置文件图像 URL 也会在调试区域中丢失,图像链接显示为可选。我应该在此代码中进行哪些更改才能将图像链接正确上传到 Firebase 数据库?

  if let AuthData = AuthDataResult {
                  print(AuthData.user.email)
                      var dict : Dictionary < String, Any> = [
                        "uid": AuthData.user.uid,
                          "username": self.UsernameTextField.text!,
                      "email": AuthData.user.email,

"ProfileImageUrl": "",
                      ]
    let storage = Storage.storage()
    let storageRef = storage.reference()
    let imageName = UUID().uuidString
    let imageReference = Storage.storage().reference().child(imageName)

    //2. Compress quality
    if let uploadData = self.ProfileImage.image?.jpegData(compressionQuality: 0.5){

    //3. Save image as .jpeg
    let metaDataForImage = StorageMetadata()
    metaDataForImage.contentType = "image/jpeg"

    //4. Add the data to Firebase Storage
    imageReference.putData(uploadData, metadata: metaDataForImage) { (meta, err) in
        if let err = err{
            print(err.localizedDescription)
        } else {
            //5. Retrieving the image URL
            imageReference.downloadURL { (url, err) in
                if let err = err{
                    print(err.localizedDescription)
                } else {
                    //6. Print the complete URL as string
                    let urlString = url?.absoluteString
                    print(urlString)
                }

                Database.database().reference().child("users").child(AuthData.user.uid).updateChildValues(dict, withCompletionBlock: { (error,ref) in
                    if error == nil {
                        print("Done")
                        return
                    }

【问题讨论】:

  • 我看不到您将 URL 写入数据库的位置。确保在 imageReference.downloadURL { ( 完成时调用的闭包 inside 执行此操作,因此 *inside 与步骤 6 的代码块相同。
  • @FrankvanPuffelen 在尝试格式化此代码后(它有些不完整)。我认为问题出在.updateChildValues(dict,因为没有dict 数据填充了要写入的url。此外,如果出现错误(例如 AuthData.user.uid 无效),则不会捕获错误,代码只会静默失败。
  • 嘿,Jay,我感觉代码仍然不完整。如果不是:您的猜测听起来确实不错,所以如果您觉得可以帮助 OP,请写下答案。
  • AuthData @Jay 没有错误
  • 但是没有错误处理代码你怎么知道?代码格式不正确,但似乎所有代码都是AuthData var 的一部分?最佳实践是用小写命名变量...大写类和结构名称。

标签: ios swift firebase firebase-realtime-database firebase-storage


【解决方案1】:

问题中的所有代码似乎都在 AuthData 变量中。

这个问题是由其中一个键引起的:dict var 中的值对是一个空字符串。我会缩短一点以突出这个问题。这是我添加的 cmets 的原始代码:

 if let AuthData = AuthDataResult {
    var dict : Dictionary < String, Any> = [
        "uid": AuthData.user.uid,
        "username": self.UsernameTextField.text!,
        "email": AuthData.user.email,
        "ProfileImageUrl": "",  // <--- Profile ImageUrl is an empty string
    ]

    imageReference.putData(uploadData, metadata: metaDataForImage) { (meta, err) in
        if let err = err{
        } else {
            imageReference.downloadURL { (url, err) in
                if let err = err{
                } else {
                    let urlString = url?.absoluteString
                }

                //The ProfileImageUrl key: value pair within the **dict** var is an
                //  empty string at this point, so no url is written.
                let dbRef = Database.database().reference()
                let usersRef = dbRef.child("users").child(AuthData.user.uid)
                usersRef.updateChildValues(dict, withCompletionBlock: { (error,ref) in
                   if error == nil {
                      print("Done")
                      return
                   }
                   //note that if an error occurs, the code silently fails

要修复,请使用您要写入的数据填充字典。

这是代码的更正部分,其中包括错误检查和使用下载 url 填充 ProfileImageUrl,然后将其写入 Firebase。

imageReference.downloadURL { (url, error) in
    if let err = error {
        print(err.localizedDescription)
        return
    }

    guard let validUrl = url else {
        print("url was not valid")
        return
    }

    let urlString = validUrl.absoluteString
    dict["ProfileImageUrl"] = urlString //update the dict with the url

    let dbRef = Database.database().reference()
    let usersRef = dbRef.child("users").child(AuthData.user.uid)
    usersRef.updateChildValues(dict, withCompletionBlock: { error, ref in
        if let err = error {
            print(err.localizedDescription)
            return
        }

        print("Successfully wrote auth data and url")
    })
}

【讨论】:

    【解决方案2】:

    我有根据的猜测是,当上传尚未完成或尚未检索到下载 URL 时,您正在将用户信息写入数据库。上传和请求下载 URL 都是异步操作,这意味着任何依赖于它们完成的代码都需要在操作完成时执行(或从那里调用)的闭包中。

    let storage = Storage.storage()
    let storageRef = storage.reference()
    let imageName = UUID().uuidString
     let imageReference = Storage.storage().reference().child(imageName)
    
     //2. Compress quality
     if let uploadData = self.ProfileImage.image?.jpegData(compressionQuality: 0.5){
    
         //3. Save image as .jpeg
         let metaDataForImage = StorageMetadata()
         metaDataForImage.contentType = "image/jpeg"
    
         //4. Add the data to Firebase Storage
         imageReference.putData(uploadData, metadata: metaDataForImage) { (meta, err) in
             if let err = err{
                 print(err.localizedDescription)
             }
             else{
                 //5. Retrieving the image URL
                 imageReference.downloadURL { (url, err) in
                     if let err = err{
                         print(err.localizedDescription)
                     }
                     else{
                         //6. Print the complete URL as string
                         let urlString = url?.absoluteString
                         print(urlString)
    
                         // 7. Write the URL to the database here <--
                     }
    

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 2020-11-02
      • 2017-05-04
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2017-02-23
      • 2020-01-10
      相关资源
      最近更新 更多