【问题标题】:How to download URL from firebase? not receiving an error but not downloading either?如何从 Firebase 下载 URL?没有收到错误但也没有下载?
【发布时间】:2018-12-26 16:23:56
【问题描述】:

当使用图像选择器抓取所选图像并将其放置在 Firebase 存储中时,我希望能够下载 URL 并在应用程序中替换个人资料图像。不幸的是,当进程到达脚本中的 URLSession 时,什么也没有发生。没有错误显示,也没有dispatchQueue。该应用程序不会崩溃,而只是跳过所有内容。对代码修复有什么想法或建议?

  if let profileImageUploadedData = self.profileImage.image, let uploadData = profileImage.image?.jpegData(compressionQuality: 0.1)
            {

                storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
                    if error != nil
                    {
                        print("Downdloading putData Error: \(error!.localizedDescription)")
                        return
                    }
                    storageRef.downloadURL(completion: { (url, error) in
                        if error != nil
                        {
                            print("DownloadURL ERROR \(error!.localizedDescription)")
                            return
                        }

                        if let profileImageUrl = url?.absoluteString
                        {
                            print("Profile image uploading...")
                            let values = ["profileImageUrl": profileImageUrl]

                            let url = URL(fileURLWithPath: profileImageUrl)
                            URLSession.shared.dataTask(with: url) { (data, response, error) in // ERROR OCCURING NEED TO FIX
                                if error != nil
                                {
                                    print("* URL SESSIONS ERROR: \(error!)")
                                    return
                                }
                                DispatchQueue.main.async
                                {
                                    print("Trying to register profile")
                                    self.registerUserIntoDatabaseWithUID(uid: uid, values: values as [String : AnyObject])
                                    self.profileImage.image = UIImage(data: data!)
                                    print("Dispatch: \(data!)")
                                }

                                print("Profile image successfull uploaded to storage")
                            }
                        }
                    })

                }).resume()
                print("** Profile Image Data Uploaded:\(profileImageUploadedData)")
            }
}

func registerUserIntoDatabaseWithUID(uid: String, values: [String: AnyObject])
{
    print("Registering to database")
    let dataReference = Database.database().reference(fromURL: "URL String")
    let usersReference = dataReference.child("users").child(uid)
    usersReference.updateChildValues(values, withCompletionBlock: { (err, reference) in
        if err != nil
        {
            print(err!)
            return

        }
//            self.profileImage.image = values["profileImageUrl"] as? UIImage
//            self.fetchProfileImage()
        self.dismiss(animated: true, completion: nil)
            print("Saved user sussccessfully in database")

        })

    }
}

【问题讨论】:

  • 您在这里尝试做什么有点不清楚。如果您想根据 URL 从存储中下载图像,那并不是真正的方法。您通常会根据 url 制作一个 ref,然后使用 .getData 下载实际文件。或者您是否尝试上传选定的图像,然后获取其存储位置的 URL 并将其保存在您的应用程序中?还是……别的什么?
  • 您好 Jay,我正在尝试上传选定的图像,然后从其存储位置获取 url,并在每次用户注销并重新登录应用程序时显示该图像@Jay
  • @Jay 我也在脚本中添加了另一部分,我目前必须更好地理解。非常感谢您的宝贵时间!
  • 不幸的是,问题中的代码都没有真正做到这一点 - 还要注意您已经将 3 个不同的问题合二为一。 !)如何将图像上传到存储并将其 url 存储在 Firebase 数据库中 2)如何从存储中下载图像 3)如何在登录时从 Firebase 数据库获取 url 以执行 #2 中的下载。概括地说,该过程是:验证用户->获取 UID->从 Firebase 数据库获取下载 URL->下载图像。你能把问题缩小一点,我们来看看!
  • @Jay 我完全理解。因此,在脚本中,它确实完成了将图像上传到 firebase 存储的任务。主要问题是如何获取downloadURL并将图像下载到profileImage。

标签: swift firebase imagedownload


【解决方案1】:

这是一个大问题,实际上需要许多不同的答案,所以我们只关注一个;

如何对用户进行身份验证,获取存储在 Firebase 数据库中的 url 引用存储在 Firebase Storage 中的图像,然后下载该图像 图片。

我们来了

首先 - 验证用户

Auth.auth().signIn(withEmail: user, password: pw, completion: { (auth, error) in
    if let x = error {
       //handle an auth error
    } else {
        if let user = auth?.user {
            let uid = user.uid
            self.loadUrlFromFirebaseDatabase(withUid: uid)
        }
    }
})

现在用户已通过身份验证,从 Firebase 数据库获取图像位置 url

func loadUrlFromFirebaseDatabase(withUid: String) {
    let thisUserRef = self.ref.child("users").child(withUid)
    let urlRef = thisUserRef.child("url")
    urlRef.observeSingleEvent(of: .value, with: { snapshot in
        if let url = snapshot.value as? String {
            self.loadImageUsingUrl(url: url)
        } else {
            print("no image for user")
        }
    })
}

现在我们在 Firebase 存储中获得了图像的位置,获取它

func loadImageUsingUrl(url: String) {
    let storage = Storage.storage()
    let imageRef = storage.reference(forURL: url)
    imageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
        if let error = error {
            print("error downloading \(error)")
        } else {
            if let image = UIImage(data: data!) {
                //do something with the image
            } else {
                print("no image")
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多