2017-09-30 15 views
0

私は、ユーザーがログインできるときにアプリケーションを開発しています。ユーザープロファイルページで、ユーザーは自分のアプリケーションに表示する画像プロファイルを選択できます。この画像は、FirebaseデータベースとFirebase Storageに保存されています。 私は、彼が望むなら、ユーザーが現在の画像プロフィールを削除することを決定できます。 私はそれを行う方法を見つけることができません、どのようにFirebase Storageから彼のイメージを削除することができます、私はストレージに置くためにメタデータを使用します。Firebase Storageから写真を削除する方法

はここFirebaseストレージとFirebaseデータベースにアップロード画像のための私のコードです:

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

私はボタン「写真を削除」を追加した場合、どのように私はこのイメージを削除することができますか? Firebase Storageでこのイメージを取得するにはどうしたらいいですか?私は正しいイメージを見つけられず、それを削除することができません.Firebase Storageにフォルダを作成する方法がわからないので、すべてのユーザイメージはStorageの同じセクションにあり、右画像(imageUid)。

+0

私はこのようなイメージのためのフォルダを作ることができると思います: 'Storage.storage()。reference()。child(" YourImagesFolder ")。子(imgUid).putData(...' – 3stud1ant3

+0

無料のアカウント、Firebase Storageにフォルダが作成されていないのでフォルダを作成できます –

答えて

1

イメージを削除するには、イメージへのパスを再作成する必要があります。これは、イメージのファイル名を知ることを意味します。

現在、画像を保存すると、それぞれの画像にランダムなUUIDが割り当てられ、バケットのルートにチャッキングされますが、これは組織の観点からは役立ちません。次のように私は、各ユーザー用のフォルダを作成し、(profilePic.jpgなど)便利なものとしてイメージを保存します:

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

は、今、私たちは簡単にプロフィールの写真を見つけることができ、我々は簡単にそれを削除することができます。

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

ありがとうございます。 lderが作成されました。おそらく、Firebaseのサブスクリプションでのみ可能ですか? –

+0

あなたのコードは動作しますが、なぜFirebase Storageの各ユーザのフォルダが見えないのですか?それは作成されたようだが、それを見ることができない –

+0

@Giggsは多分コンソールにアップデートする時間を与えるだろうか?彼らは見せるべきです。 –

関連する問題