简体   繁体   English

Firebase快速上传多个图像

[英]Firebase upload multiple images in swift

I want to upload multiple images with some text in firebase when user pushed the button. 当用户按下按钮时,我想在Firebase中上传带有某些文本的多个图像。 to do that I implemented for loop. 为此我实现了循环。 Let's say if user picked 3 photos, then I think firebase should look like this 假设用户选择了3张照片,那么我认为Firebase应该像这样

 "Post": {
    "uid": {
      "Text": "some text",
      "imageUrl": "url",
      "imageUrl2": "url2",
      "imageUrl3": "url3"
    }
  }

But it returns like this. 但是它会像这样返回。 That tweetImageUrl is the third photo's url which is picked last. 该tweetImageUrl是最后选择的第三张照片的URL。 also inside storage, there is only one photo which is the third photo as well. 在内部存储区中,只有一张照片,也就是第三张照片。 图片在这里

How can I upload images correctly? 如何正确上传图像? Here is my code. 这是我的代码。

    func sendTweets() {

         let text = textView.text
         let tweetLength = textView.text.count
         let imagesNumber = imagesArray.count
         format.dateFormat = "yyyy-MM-dd HH:mm"
         let strDate = format.string(from: date as Date)
         let childRef = ref.child("TWEETS").child(uid!).childByAutoId()
         let key = ref.child("TWEETS").child(uid!).childByAutoId().key
         let childStorageRef = storageRef.child("tweetImage").child(uid!).child(key)

  if(tweetLength>0 && imagesNumber>0)
    {

       for image in imagesArray {

        let tweetImage = image
        if let uploadData = UIImagePNGRepresentation(tweetImage) {

         childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
                    if error != nil {
                        print("error")
        } else {

        if let imageUrl = metadata?.downloadURL()?.absoluteString {
          let values = ["Text": text!, "tweetImageUrl": imageUrl, "Date": strDate]  as [String : Any]
            childRef.updateChildValues(values)

              }
            }
          })
        }
      }
       dismiss(animated: true, completion: nil)
    }
         else if(tweetLength>0)
         {
            let values = ["Text": text!, "Date": strDate]  as [String : Any]

         childRef.updateChildValues(values)

         dismiss(animated: true, completion: nil)

         }

         else if(imagesNumber>0)
         {

        for image in imagesArray {

            let tweetImage = image
            if let uploadData = UIImagePNGRepresentation(tweetImage) {

             childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
                if error != nil {
                    print("error")
                } else {

            if let imageUrl = metadata?.downloadURL()?.absoluteString {
            let values = ["tweetImageUrl": imageUrl, "Date": strDate]  as [String : Any]
            childRef.updateChildValues(values)
                }
             }
          })
        }
      }
        dismiss(animated: true, completion: nil)
  }  else {
        alertTheUser(title: "error", message: "enter something.")
    }
}//func

Also when it comes to retrieve those images and display on the collection view after uploaded, is this proper way to achieve that? 同样,当检索这些图像并在上传后显示在集合视图上时,这种正确的方法是否可以实现? Thank you in advance! 先感谢您!

I think this is not the right database structure that you should follow while using firebase. 我认为这不是使用Firebase时应遵循的正确数据库结构。 If you store images like that say imageurl1, imageurl2..., etc. It would be really difficult to fetch those values without knowing the key for it. 如果存储这样的图像,例如imageurl1,imageurl2 ...等,那么在不知道密钥的情况下很难获取这些值。 I suggest you to follow a structure like 我建议你遵循这样的结构

"Post": {
    "uid": {
      "Text": "some text",
      "images": {
         autoID1: url1,
         autoID2: url2
      }
    }
  }

So It would be easy to fetch those URLs 因此,获取这些URL很容易

You could append the URLs by using 您可以使用来附加网址

let postRef = Database.database().reference(withPath: "Post").child(uid).child("images")
let autoID = postRef.childByAutoID().key
postRef.child(autoID).setValue(url)

Thanks to Rozario's help, I figured it out. 感谢Rozario的帮助,我弄清楚了。 What I was missing was I didn't declare AutoId inside for-loop. 我所缺少的是我没有在for循环中声明AutoId。 That's why old value was replaced by new value. 这就是为什么旧值被新值替代的原因。 code below worked as I expected. 下面的代码按预期工作。 Node looks like this. 节点看起来像这样。 hope it would help. 希望对您有所帮助。

  "Post": {
    "uid": {
      "Text": "some text",
      "images": {
         autoID1: url1,
         autoID2: url2
      }
    }
  }

code below. 下面的代码。

func sendTweets() {

             let text = textView.text
             let tweetLength = textView.text.count
             let imagesNumber = imagesArray.count
             format.dateFormat = "yyyy-MM-dd HH:mm"
             let strDate = format.string(from: date as Date)
             let childRef = ref.child("TWEETS").child(uid!).childByAutoId()

      if(tweetLength>0 && imagesNumber>0)
        {

           for image in imagesArray {

            let postRef = childRef.child("tweetImageUrl")
            let autoID = postRef.childByAutoId().key
            let childStorageRef = storageRef.child("Images").child(uid!).child(autoID)
            let tweetImage = image

            if let uploadData = UIImagePNGRepresentation(tweetImage) {

             childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
                        if error != nil {
                            print("error")
            } else {

            if let imageUrl = metadata?.downloadURL()?.absoluteString {
                let values = ["Text": text!, "Date": strDate]  as [String : Any]
                let value = [autoID: imageUrl]  as [String : Any]
                childRef.updateChildValues(values)
                postRef.updateChildValues(value)
                  }
                }
              })
            }
          }
           dismiss(animated: true, completion: nil)
        }
             else if(tweetLength>0)
             {
                let values = ["Text": text!, "Date": strDate]  as [String : Any]

             childRef.updateChildValues(values)

             dismiss(animated: true, completion: nil)

             }

             else if(imagesNumber>0)
             {

            for image in imagesArray {

                let postRef = childRef.child("tweetImageUrl")
                let autoID = postRef.childByAutoId().key
                let childStorageRef = storageRef.child("Images").child(uid!).child(autoID)
                let tweetImage = image

                if let uploadData = UIImagePNGRepresentation(tweetImage) {

                 childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in
                    if error != nil {
                        print("error")
                    } else {

                if let imageUrl = metadata?.downloadURL()?.absoluteString {
                let values = ["Date": strDate]  as [String : Any]
                childRef.updateChildValues(values)
                postRef.child(autoID).setValue(imageUrl)
                    }
                 }
              })
            }
          }
            dismiss(animated: true, completion: nil)
      }  else {
            alertTheUser(title: "error", message: "enter something.")
        }

    }//func

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM