Firebase上传图片并获取url问题

我正在尝试拍摄3张图片,并将其发布到firebase存储中,并获取下载url并将其放入Firebase数据库。 我的代码只上传第一张图片,但如果有第二张图片,则不会上传任何内容。

@IBOutlet weak var titleText: UITextField! @IBOutlet weak var subtitleText: UITextField! @IBOutlet weak var authorText: UITextField! @IBOutlet weak var dateText: UITextField! @IBOutlet weak var articleText: UITextView! @IBOutlet weak var tagsText: UITextField! @IBOutlet weak var myImageView1: UIImageView! @IBOutlet weak var myImageView2: UIImageView! @IBOutlet weak var myImageView3: UIImageView! @IBOutlet weak var postType: UITextField! @IBOutlet weak var postStyle: UITextField! var ref:DatabaseReference? override func viewDidLoad() { super.viewDidLoad() ref = Database.database().reference() let tapGestureRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) myImageView1.isUserInteractionEnabled = true myImageView1.addGestureRecognizer(tapGestureRecognizer1) let tapGestureRecognizer2 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) myImageView2.isUserInteractionEnabled = true myImageView2.addGestureRecognizer(tapGestureRecognizer2) let tapGestureRecognizer3 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) myImageView3.isUserInteractionEnabled = true myImageView3.addGestureRecognizer(tapGestureRecognizer3) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } var selected = 0 func imageTapped(tapGestureRecognizer: UITapGestureRecognizer){ let image = UIImagePickerController() image.delegate = self image.sourceType = UIImagePickerControllerSourceType.photoLibrary image.allowsEditing = false let tappedImage = tapGestureRecognizer.view as! UIImageView selected = tappedImage.tag self.present(image, animated: true) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { if let myImageView1 = self.view.viewWithTag(selected) as? UIImageView { myImageView1.image = image } } else { //error } self.dismiss(animated: true, completion: nil) } @IBAction func upload(_ sender: Any) { let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") if let uploadData = UIImagePNGRepresentation(self.myImageView1.image!) { storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in let storageRef2 = Storage.storage().reference().child("images2/\(NSUUID().uuidString)/image2.png") if let uploadData2 = UIImagePNGRepresentation(self.myImageView2.image!) { storageRef2.putData(uploadData2, metadata: nil, completion: { (metadataSecond, error) in if error != nil { print("error") return } else { let downloadURL = metadata?.downloadURL()?.absoluteString let downloadURL2 = metadataSecond?.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, "Download URL": (downloadURL), "Download URL 2": (downloadURL2)]) } self.performSegue(withIdentifier: "segue321", sender: self) } 

如果我理解了你的图片浏览,就好像你有多个图片浏览,而且每个人都可以从中select图片。

考虑到这一点,你当前的代码只处理一个例子,即myImageView1 ,但没有处理myImageView2myImageView3

1.可扩展解决scheme

你需要做的是把你的imageviews数组,然后遍历这个数组,并开始上传每个图像。

PS: 此代码未经testing,旨在用作参考

viewDidLoad()创build保存图像的数组,如下所示

 var imageViews: [UIImageView] override func viewDidLoad() { // After initializing them imageViews = [myImageView1, myImageView2, myImageView3] } 

由于您有一个selectedvariables来跟踪被点击的imageView,我们也可以使用它来访问我们数组中的相应视图,如下所示

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

在你的upload ,你想迭代imageViews并开始上传每个图像。

 @IBAction func upload(_ sender: Any) { let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") for imageView in imageViews { if let uploadData = UIImagePNGRepresentation(imageView.image) { // continue with your stuff } else { // Upload Data creation error } } } 

2.不可扩展

只需在imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])写入多个if语句来计算myImageView2myImageView3

两分钱:

我推荐第一个解决scheme,因为它不受当前图像浏览次数的限制。 如果您select在将来添加更多,只需将其附加到数组。 然而,第二个解决scheme导致了多个if语句和复杂的代码。

编辑1 发现的错误

在上面的实现中,假设用户将按顺序select所有图像视图,即imageView1-> imageView2-> imageView3-> imageView4-> imageView5->等 。 如果用户selectimageView1-> imageView3-> imageView5

我们的数组在上面的场景中看起来像这样:

 [0]->[has image] [1]->[nil] [2]->[has image] [3]->[nil] [4]->[has image] 

尝试创buildUIImagePNGRepresentation时,nil段会导致崩溃。

在上传之前进行简单的图片存在检查就可以解决这个问题。

 @IBAction func upload(_ sender: Any) { let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") for imageView in imageViews { if imageView.image != nil { if let uploadData = UIImagePNGRepresentation(imageView.image) { // continue with your stuff } else { // upload data creation error } } } } 

在你添加一个计数器的课程开始的同时,尝试这三个图像

 var counter: Int = 0 

然后你修改imagePickerController:`

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

我不知道它是一次只有两个图像工作,但三个一次它的工作。 对于其他情况,你应该试一试自己!