Загрузить изображение с устройства на базу - PullRequest
0 голосов
/ 07 февраля 2019

Я пытался загрузить изображение в Firebase, а затем установить его в качестве изображения профиля пользователя.По какой-то причине URL-адрес изображения является нулевым, и я полагаю, что это что-то связанное с метаданными в этой функции:

func uploadProfileImage(_ image:UIImage, completion: @escaping((_url:URL?)->()))
{

    guard let uid = Auth.auth().currentUser?.uid else { return }

    let storageRef = Storage.storage().reference().child("user/\(uid)")

    guard let imageData = image.jpegData(compressionQuality: 0.5) else {return}


    let metaData = StorageMetadata()
    metaData.contentType = "image/jpg"

    storageRef.putData(imageData, metadata: metaData) { metaData, error in
        if error == nil, metaData != nil {

            storageRef.downloadURL { url, error in
                completion(url)
                // success!
            }
        }
    }
}

URL-адрес, возвращаемый в complition, равен nil или error! = Nil, metaData ==ноль

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вот быстрое решение загрузить изображение с заданным именем файла, а затем захватить URL-адрес и сохранить его в этом профиле пользователя.

Неясно, как использовались метаданные в вопросе.

Это не проверено, так что, возможно, опечатка.

func setUsersPhotoURL(withImage: UIImage, andFileName: String) {
    guard let imageData = withImage.jpegData(compressionQuality: 0.5) else { return }
    let storageRef = Storage.storage().reference()
    let thisUserPhotoStorageRef = storageRef.child("this users uid").child(andFileName)

    let uploadTask = thisUserPhotoStorageRef.putData(imageData, metadata: nil) { (metadata, error) in
        guard let metadata = metadata else {
            print("error while uploading")
            return
        }

        thisUserPhotoStorageRef.downloadURL { (url, error) in
            print(metadata.size) // Metadata contains file metadata such as size, content-type.
            thisUserPhotoStorageRef.downloadURL { (url, error) in
                guard let downloadURL = url else {
                    print("an error occured after uploading and then getting the URL")
                    return
                }

                let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
                changeRequest?.photoURL = downloadURL
                changeRequest?.commitChanges { (error) in
                    //handle error
                }
            }
        }
    }
}
0 голосов
/ 07 февраля 2019

Ниже приведен рабочий код для добавления изображения в хранилище и базу данных Firebase для последующего использования с использованием Swift 4

func uploadProfileImage () {

    let storedImage = storagebaseRef.child("yourLocation")

    if let uploadData = UIImageJPEGRepresentation(yourImg, 1) 
    {
        storedImage.putData(uploadData, metadata: nil, completion: { (metadata, error) in
            if error != nil {

            }
            storedImage.downloadURL(completion: { (url, error) in
                if error != nil {
                }

                if let urlText = url?.absoluteString {                      
                        self.databaseRef.child("yourLocation").updateChildValues(["pic" : urlText], withCompletionBlock: { (error, ref) in
                           if error != nil {                        
                               self.showAlert(message: "Please Try Again", title: "Error")
                               return
                           }
                        })
                }           
            })       
        })
    }  
}
...