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
,但没有处理myImageView2
和myImageView3
。
1.可扩展解决scheme
你需要做的是把你的imageviews数组,然后遍历这个数组,并开始上传每个图像。
PS: 此代码未经testing,旨在用作参考
在viewDidLoad()
创build保存图像的数组,如下所示
var imageViews: [UIImageView] override func viewDidLoad() { // After initializing them imageViews = [myImageView1, myImageView2, myImageView3] }
由于您有一个selected
variables来跟踪被点击的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语句来计算myImageView2
和myImageView3
两分钱:
我推荐第一个解决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) }
我不知道它是一次只有两个图像工作,但三个一次它的工作。 对于其他情况,你应该试一试自己!