2017-06-29 5 views
1

warum funktioniert das nicht? Wie bekomme ich alle Funktionen zum Ausführen und Ausführen der Aufgabe? Ich versuche zwei Bilder auf meinen Firebase-Speicher hochzuladen und erhalte zwei Download-URLs für die Bilder in meiner Firebase-Datenbank (innerhalb des Posts). Und wie bekomme ich es, das zweite Bild zu ignorieren, wenn es nicht da ist?Wie können Sie zwei Bilder gleichzeitig in Firebase Storage hochladen?

@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)]) 


      } 

     }) 
    } 

}

Antwort

4

Um zu überprüfen, ob die Datei bereits vorhanden Sie storageRef.metadataWithCompletion anrufen möchten.

Um ein optionales Bild auspacken Sie nur

tun können

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

EDIT

So etwas wie dieses

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 
     } 
    } 

auch sicher, sind Sie mit Firebase sonst authticated Uploads wird fehlschlagen. Überprüfen Sie die Konsole, ob die Authentifizierung fehlgeschlagen ist.

EDIT2

Dies sollte den Trick.

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)]) 

      }) 
     } 
    } 
} 
+0

also sollte ich den Datenbank Teil zweimal in jedem der Handle es Abschnitt? – Riccardo

+0

Soll "image1" nur hochgeladen werden, wenn "image" gleich null ist oder nicht hochgeladen werden kann? –

+0

Ich möchte Bild1 die ganze Zeit hochladen und Image2 hochladen, wenn es dort ist – Riccardo

Verwandte Themen