Как загрузить URL-адрес изображения профиля в базу данных Firebase - PullRequest
0 голосов
/ 13 марта 2020

Когда мой пользователь регистрируется, он использует изображение профиля, которое отправляется непосредственно в базу данных. Изображение загружается в хранилище 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
                    }

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Похоже, что весь код в вопросе находится внутри переменной AuthData.

Проблема вызвана тем, что одна из пар ключ: значение в переменной dict является пустой строка. Я уменьшу это немного, чтобы высветить проблему. Вот исходный код с моими добавленными комментариями:

 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

Чтобы исправить, заполните dict данными, которые вы хотите записать.

Вот исправленный раздел кода, который включает проверку ошибок и заполнение ProfileImageUrl с URL-адресом для загрузки и последующей записью в 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")
    })
}
0 голосов
/ 14 марта 2020

Мое обоснованное предположение состоит в том, что вы записываете пользовательскую информацию в базу данных, когда загрузка еще не завершена или 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 <--
                 }
...