【问题标题】:How to upload 2 images to Firebase Storage at the same time?如何同时将 2 张图片上传到 Firebase 存储?
【发布时间】:2017-12-03 13:31:39
【问题描述】:

为什么这不起作用?如何让所有功能运行并执行其任务?我正在尝试将 2 个图像上传到我的 firebase 存储中,并为我的 firebase 数据库(帖子内部)中的图像获取两个下载 URL。如果第二张图片不存在,我该如何让它忽略第二张图片?

  @IBAction func pickImage1(_ sender: Any) {


    let image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image.allowsEditing = false
    selected = 1

    self.present(image, animated: true)
}

//Add didFinishPickingMediaWithInfo here
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        if selected == 1 {
            myImageView1.image = image
        } else {
            myImageView2.image = image
        }
    }
    else {
        //error
    }
    self.dismiss(animated: true, completion: nil)
}


@IBAction func pickImage2(_ sender: Any) {

       let image2 = UIImagePickerController()
    image2.delegate = self
    image2.sourceType = UIImagePickerControllerSourceType.photoLibrary
    image2.allowsEditing = false
    selected = 2

    self.present(image2, animated: true)
}




@IBAction func upload(_ sender: Any) {


    if let image1 = myImageView1.image {
        guard let data = UIImagePNGRepresentation(image1) else { return }

        let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png")
        storageRef.putData(data, metadata: nil, completion: { (metadata, error) in

            if error != nil {
                print("error")
                return

            }


            else {
                let downloadURL = metadata?.downloadURL()?.absoluteString


                self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL": (downloadURL)])

             return
            }



        })
    }

    if let image2 = myImageView2.image {
        guard let data = UIImagePNGRepresentation(image2) else { return }

        let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image1.png")
        storageRef.putData(data, metadata: nil, completion: { (metadata, error) in
            if error != nil {
                print("error")
                return

            }


            else {
                let downloadURL = metadata?.downloadURL()?.absoluteString
                let downloadURL2 = metadata?.downloadURL()?.absoluteString

                self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL": (downloadURL), "Download URL 2": (downloadURL2)])


            }

        })
    }

}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database firebase-storage


    【解决方案1】:

    要检查文件是否已经存在,您需要调用storageRef.metadataWithCompletion

    要打开可选图像,您可以这样做

    if let image = self.myImageView2.image as? UIImage { // upload it }

    编辑

    像这样的

        if let image = imageView.image {
            guard let data = UIImagePNGRepresentation(image) else { return }
    
            let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png")
            storageRef.putData(data, metadata: nil, completion: { (metadata, error) in
                // Handle it
            }
        }
    
        if let image1 = imageView1.image {
            guard let data = UIImagePNGRepresentation(image1) else { return }
    
            let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image1.png")
            storageRef.putData(data, metadata: nil, completion: { (metadata, error) in
                // Handle it
            }
        }
    

    还要确保您已通过 Firebase 进行身份验证,否则上传将失败。检查控制台它会告诉你身份验证是否失败。

    EDIT2

    这应该可以解决问题。

    func upload(image: UIImage, completion: @escaping (String?) -> ()) {
        guard let data = UIImagePNGRepresentation(image) else { return completion(nil)}
    
        let storageRef = databaseStorage.child("images/\(NSUUID().uuidString)/image.png")
        storageRef.putData(data, metadata: nil) { (metaData, error) in
            if error != nil {
                print(error?.localizedDescription ?? "Failed to upload image")
            } else if metaData != nil && metaData?.downloadURL() != nil {
                completion(metaData?.downloadURL()!.absoluteString)
            } else {
                completion(nil)
            }
        }
    }
    
    func upload() {
        if imageView.image == nil && imageView1.image == nil {
            return;
        }
    
        if let image = imageView.image {
            upload(image: image, completion: { [weak self] (url) in
                if let image1 = self?.imageView1.image {
                    self?.upload(image: image1, completion: { (url1) in
                        if url == nil && url1 == nil {
                            return
                        } else if url == nil {
                            self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL1": (url1)])
                        } else if url1 == nil {
                            self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL": (url)])
                        } else {
                            self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL": (url), "Download URL1" : (url1)])
                        }
                    })
                }
            })
        } else {
            if let image1 = self.imageView1.image {
                self.upload(image: image1, completion: { (url1) in
                    if (url1 == nil) {
                        return
                    }
    
                    self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "PostSize": self.postSize.text, "Download URL": (url)])
    
                })
            }
        }
    }
    

    【讨论】:

    • 那么我应该在每个句柄部分中两次放置数据库部分吗?
    • 如果image 为nil 或上传失败,您是否只想上传image1
    • 我想一直上传image1,如果有就上传Image2
    • 这正是这样做的。 database part 是什么?
    • 我更新了我的问题。我有它获取 DownloadURL 并将其添加到 firebase 数据库的 post 部分的部分
    猜你喜欢
    • 2018-02-26
    • 2020-06-24
    • 2020-11-19
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多