0

当我的用户注册时,他们使用的是直接进入 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
                    }
4

2 回答 2

1

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

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

 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")
    })
}
于 2020-03-15T13:23:17.843 回答
0

我有根据的猜测是,当上传尚未完成或尚未检索到下载 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 <--
                 }
于 2020-03-13T22:52:40.077 回答