【问题标题】:url coming back from firebase storage is nil Swift4从firebase存储返回的url是nil Swift4
【发布时间】:2019-03-25 22:32:02
【问题描述】:

我正在尝试将图像上传到 firebase 存储并获取下载 url 以将其保存在数据库中,但我得到一个 nil 值并且函数在检查时返回。我遵循了其他帖子中的文档和解决方案,但我看不出我在哪里弄错了。 功能是:

func uploadImage(completed: @escaping (Bool) -> (),_ image: UIImage ){
        print("      ##############         UPLOAD STARTED         ###########")

        //        let stringURL: String?
//        guard let uid = Auth.auth().currentUser?.uid else {return} // use the userUid to sign the alert


        // Create a root reference
        let storageRef = Storage.storage().reference()

        // Create a reference to "mountains.jpg"
//        let alertsRef = storageRef.child("userAlertImages.jpg")//("user/\(uid)") // change path for userAlertImages path

        // Create a reference to 'images/mountains.jpg'
        let alertsImagesRef = storageRef.child("Alert Images/userAlertImages.jpg")

        // While the file names are the same, the references point to different files
//        alertsRef.name == alertsImagesRef.name;            // true
//        alertsRef.fullPath == alertsImagesRef.fullPath;    // false


        let imageData = UIImageJPEGRepresentation(image, 0.5)

        let metaData = StorageMetadata()
        metaData.contentType = " jpeg " // data type
        metaData.customMetadata = ["k1": "",
                                   "k2" : " ",
                                   "k3" : "",
                                   "k4" : ""]

        alertsImagesRef.putData(imageData! as Data , metadata: metaData) { metaData, error in
            if(error != nil){
                print(error as Any)
                return
            }
        }

        // Fetch the download URL
        alertsImagesRef.downloadURL { (url,error) in
            guard let downloadURL = url else {
                print("@@@@@@@@@@ downloaded url is: \(url)  @@@@@@@@@@@@@")
                return
            }
            NewMapViewController.alertImageURL = (url?.absoluteString) ?? ""
//            NewMapViewController.alertImageURL = (downloadURL)

            print("######### url is:\(String(describing: url)) #########")
            completed(true)
            //                            self.postAlertNotification()
            self.tapCounter = 0
            self.performSegue(withIdentifier: "chooseIconSegue", sender: self)

        }

}

你能看出哪里出错了吗? 非常感谢。

【问题讨论】:

  • 首先,您的问题是您将图像保存到同一个存储链接。其次,我们甚至不知道您在 Firebase 存储中的文件结构。
  • @El 番茄。到目前为止,文件路径就像保存行中的路径一样。正如文件路径所建议的那样,Alert Images 是包含名为 userAlertImages 的内部图片的文件夹名称。为什么会出现问题?我仍然必须在图片名称中添加一个随机数以使其唯一,或者每次我知道时我都会覆盖..问题是关于获取我刚刚上传面团的图片的 url.. 文件结构目前非常基本. userAlertImages 是顶级文件夹。希望这会有所帮助。

标签: ios swift firebase firebase-storage


【解决方案1】:

想一想,我意识到downloadURL fetch 实际上是在图片上传完成之前完成的,那是因为 Firebase 是异步的。所以我在上传部分添加了completion block,并在completion scope 中添加了downloadURL 获取部分。 它不会快速眨眼,我会感谢任何关于加快速度的建议,因为这样在seguegets 执行之前会有一点延迟。 这一点都不烦人,我可以而且可能应该添加一个小转轮来向用户显示应用程序没有冻结,但如果可能的话,我宁愿完全避免滞后。我留下了prints,希望这篇文章能帮助像我一样刚接触 Firebase 的其他人,提供详细的几乎一步一步的指导,因为这种答案确实对我有帮助,但我还没有找到任何关于主题。 改写的函数是:

func uploadImage(completed: @escaping (Bool) -> (),_ image: UIImage ){
        print("      ##############         UPLOAD STARTED         ###########")

        // Create a root reference
        let storageRef = Storage.storage().reference()


        // Create a reference to Images folder
        let alertsImagesRef = storageRef.child("Alert Images")
        // Create a reference for new images
        let uuid = UUID()
        let imageRef = alertsImagesRef.child("userAlertImage \(uuid).jpg")

        let imageData = UIImageJPEGRepresentation(image, 0.5)

        let metaData = StorageMetadata()
        metaData.contentType = " jpeg " // data type
        metaData.customMetadata = ["k1": "",
                                   "k2" : " ",
                                   "k3" : "",
                                   "k4" : ""]

        imageRef.putData(imageData! as Data , metadata: metaData, completion: { metaData, error in
            if(error != nil){
                print(error as Any)
                return
            }
            print("               ####### image uploaded #######")
            self.tapCounter = 0
            self.performSegue(withIdentifier: "chooseIconSegue", sender: self)
            // fetch url v2
            imageRef.downloadURL(completion: { (url, err) in
                if let err = err {
                    print("Error downloading image file, \(err.localizedDescription)")
                    return
                }

                guard let url = url else { return }
                //Now you have the download URL for the image, and can do whatever you want with it.
                NewMapViewController.alertImageURL = url.absoluteString

                print("       ######### url is:\(String(describing: url)) #########")
                completed(true)
                //                            self.postAlertNotification()
//                self.tapCounter = 0
//                self.performSegue(withIdentifier: "chooseIconSegue", sender: self)
                print("      ##############         UPLOAD ENDED         ###########")
            })
        })
    }

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多