ios - Firebase 快速上传多张图片

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

当用户按下按钮时,我想在 firebase 中上传带有一些文本的多张图片。为此,我实现了 for 循环。假设如果用户选择了 3 张照片,那么我认为 firebase 应该是这样的

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

但是它返回是这样的。 tweetImageUrl 是最后选择的第三张照片的 url。同样在存储中,只有一张照片,也是第三张照片。 image here

如何正确上传图片? 这是我的代码。

    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

此外,当涉及到检索这些图像并在上传后显示在 Collection View 中时,这是实现该目标的正确方法吗? 提前致谢!

最佳答案

我认为这不是您在使用 firebase 时应遵循的正确数据库结构。 如果您像这样存储图像,比如 imageurl1、imageurl2...等。在不知道这些值的 key 的情况下获取这些值真的很困难。 我建议你遵循这样的结构

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

所以很容易获取这些 URL

您可以使用

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

关于ios - Firebase 快速上传多张图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47690247/

相关文章:

ios - 如何在模拟器上使用麦克风

ios - Swift - 更改注释图像不起作用

ios - 如何使用 Swift 检查 iOS 设备是否被锁定/解锁?

angularjs - 如何停止 angularFire 将对象中的键/值数量限制为 100?

firebase - 为我的应用推荐的 Firebase 数据结构

ios - 关于-lsqlite3.0 SQL库

ios - iPv6 支持可达性等级

xcode - Playground 中的鼠标事件 (NSTrackingArea) 不起作用

swift - 如何获得二进制包的校验和?

ios - 无法使用类型 'String' 的参数列表调用类型 '(RemoteConfigValue)' 的初始值设定项