2017-09-30 1 views
0

Ich entwickle eine App, wenn Benutzer anmelden können, auf der Benutzerprofilseite kann der Benutzer ein Bildprofil für die Show in meiner App auswählen. Dieses Bild wird in die Firebase-Datenbank hochgeladen und in Firebase Storage gespeichert. Ich möchte den Benutzer entscheiden, sein aktuelles Image-Profil zu löschen, wenn er möchte. Ich kann keinen Weg finden, es zu tun, wie kann ich sein Bild aus Firebase Storage löschen, verwende ich Metadaten, um es in Storage zu setzen.So löschen Sie ein Foto aus Firebase Storage

Hier ist mein Code für das Hochladen Bild in Firebase Lagerung und Firebase Datenbank:

// Create a path in order to save the photo in Firebase Database 
func setUser(img: String) { 
    var userUid = Auth.auth().currentUser?.uid 
    let userData = ["nickname": Auth.auth().currentUser?.displayName, "userImg": img] 

    KeychainWrapper.standard.set(userUid!, forKey: "uid") 
    let location =                                                                                                                                                                                                                          Database.database().reference().child("users").child(userUid!).child("pseudo") 
    location.setValue(userData) 
    dismiss(animated: true, completion: nil) 
} 

// Upload and put image profile in the Firebase Storage 
func uploadImg() { 
    name = Auth.auth().currentUser?.displayName 
    userUid = Auth.auth().currentUser?.uid 

    guard let img = userImagePicker.image, imageSelected == true else { 
     print("Image needs to be selected") 
     return 
    } 

    if let imgData = UIImageJPEGRepresentation(img, 0.2) { 
     let imgUid = NSUUID().uuidString 
     let metadata = StorageMetadata() 
     metadata.contentType = "image/jpeg" 

     Storage.storage().reference().child(imgUid).putData(imgData, metadata: metadata) { (metadata, error) in 
      if error != nil { 
       print("Didn't upload image in Firebase Storage") 
       self.isUploaded = false 
      } else { 
       print("Uploaded in Firebase Storage") 
       self.isUploaded = true 
       let downloadURL = metadata?.downloadURL()?.absoluteString 
       if let url = downloadURL { 
        self.setUser(img: url) 
        self.downloadPhoto(user: self.name) 
       } 
      } 
     } 
    } 
} 

// The alert Controller (user can choose to take a photo with Camera or choose an image in his library then I use UIImagePickerController in order to display the image on a UIImageView) 
@IBAction func actionButton(_ sender: Any) { 
let attributedString = NSAttributedString(string: "User photo", attributes: [ 
    NSFontAttributeName : UIFont.boldSystemFont(ofSize: 15), 
    NSForegroundColorAttributeName : UIColor.black 
    ]) 

let alertController = UIAlertController(title: "", message: "", preferredStyle: .actionSheet) 
alertController.message = nil 
alertController.setValue(attributedString, forKey: "attributedTitle") 
alertController.addAction(UIAlertAction(title: "Take photo", style: .default, handler: self.takePhoto)) 
alertController.addAction(UIAlertAction(title: "Choose in Library", style: .default, handler: self.libraryPhoto)) 
alertController.addAction(UIAlertAction(title: "Show current photo", style: .default, handler: self.showPhoto)) 
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
self.present(alertController, animated: true, completion: nil) 
} 

Wie kann ich dieses Bild löschen, wenn ich einen Button „Foto löschen“ hinzufügen? Wie kann ich dieses Image in Firebase Storage abrufen? Ich kann das richtige Bild nicht finden und lösche es, und ich weiß wirklich nicht, wie ich einen Ordner in Firebase Storage erstellen kann, also befinden sich alle Benutzerbilder im selben Abschnitt des Speichers und ich kann den rechtes Bild (imageUid).

+0

Ich denke, Sie können einen Ordner für Bilder wie folgt machen: 'Storage.storage(). Reference(). Kind (" YourImagesFolder "). Kind (imgUid) .putData (...' – 3stud1ant3

+0

Wissen Sie, ob mit ein kostenloses Konto, ich kann einen Ordner erstellen, da kein Ordner in Firebase Storage erstellt wurde –

Antwort

1

Um ein Bild zu löschen, müssen Sie den Pfad zum Bild neu erstellen können. Dies bedeutet, dass Sie den Dateinamen des Bildes kennen.

Wenn Sie Ihre Bilder im Moment speichern, weisen Sie jedem eine zufällige UUID zu und puffern die Wurzel des Buckets ein, was aus organisatorischer Sicht nicht hilfreich ist. Ich würde einen Ordner für jeden Benutzer und speichern Sie das Bild als etwas nützlich (wie profilePic.jpg) wie folgt:

func uploadImg() { 
    name = Auth.auth().currentUser?.displayName 
    userUid = Auth.auth().currentUser?.uid 

    guard let img = userImagePicker.image, imageSelected == true else { 
     print("Image needs to be selected") 
     return 
    } 

    if let imgData = UIImageJPEGRepresentation(img, 0.2) { 
     let metadata = StorageMetadata() 
     metadata.contentType = "image/jpeg" 

     // create reference to image location 
     let profilePicRef = Storage.storage().reference().child("\(userUid!)/profilePic.jpg") 
     // upload image 
     profilePicRef.putData(imgData, metadata: metadata) { (metadata, error) in 
      if error != nil { 
       print("Didn't upload image in Firebase Storage") 
       self.isUploaded = false 
      } else { 
       print("Uploaded in Firebase Storage") 
       self.isUploaded = true 
       let downloadURL = metadata?.downloadURL()?.absoluteString 
       if let url = downloadURL { 
        self.setUser(img: url) 
        self.downloadPhoto(user: self.name) 
       } 
      } 
     } 
    } 
} 

Jetzt können wir leicht das Profilbild finden, können wir sie problemlos löschen:

func deleteProfilePic() { 
    guard let userUid = Auth.auth().currentUser.uid else { 
     return 
    } 
    let pictureRef = Storage.storage().reference().child("\(userUid)/profilePic.jpg") 
    pictureRef.delete { error in 
     if let error = error { 
      // Uh-oh, an error occurred! 
     } else { 
      // File deleted successfully 
     } 
    } 
} 
+0

Vielen Dank für Ihre Antwort, aber keine fo Es ist eine Lizenz erstellt, vielleicht nur mit einem Firebase-Abonnement möglich? –

+0

Ihr Code funktioniert, aber warum kann ich nicht den Ordner für jeden Benutzer in Firebase Storage sehen. Es scheint erstellt, aber kann es nicht sehen –

+0

@Giggs vielleicht geben Sie der Konsole ein bisschen Zeit zu aktualisieren? Sie sollten zeigen. –

Verwandte Themen