简体   繁体   English

如何从Firebase存储中删除照片

[英]How to delete a photo from Firebase Storage

I'm developing an app when user can login, in the user profile page, the user can choose an image profile for show in my app. 当用户可以登录时,我正在开发一个应用程序,在用户个人资料页面中,用户可以选择要在我的应用程序中显示的图像个人资料。 This image is uploaded in Firebase Database and in stored in Firebase Storage. 此图像上载到Firebase数据库中,并存储在Firebase存储中。 I want to the user can decide to delete his current image profile if he wants to. 我希望用户可以决定是否删除他当前的图像配置文件。 I can't find a way to do it, how can I delete his image from Firebase Storage, I use metadata in order to put it in Storage. 我找不到方法,如何从Firebase Storage删除他的图像,我使用元数据将其放入Storage。

Here's my code for upload image in Firebase Storage and Firebase Database : 这是我在Firebase Storage和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)
}

How can I delete this image if I add a button "Delete photo"? 如果添加按钮“删除照片”,如何删除该图像? How can I retrieve this image in Firebase Storage? 如何在Firebase Storage中检索此图像? I'm not able to find the right image and delete it, and I really don't know how to create a folder in Firebase Storage, so all the users images are in the same section of the Storage and I can't retrieve the right image (imageUid). 我找不到正确的映像并将其删除,而且我真的不知道如何在Firebase Storage中创建文件夹,因此所有用户映像都位于该存储的同一部分,而我无法检索该映像。正确的图像(imageUid)。

To delete an image, you'll need to be able to recreate the path to the image. 要删除图像,您需要能够重新创建图像的路径。 This means knowing the file name of the image. 这意味着知道图像的文件名。

When you save your images at the moment, you're assigning each one a random UUID and chucking in the root of the bucket, which isn't helpful from an organisational standpoint. 目前,当您保存图像时,您将为每个图像分配一个随机的UUID并卡在存储桶的根目录中,这从组织的角度来看无济于事。 I would create a folder for each user and store the image as something helpful (like profilePic.jpg ), as follows: 我将为每个用户创建一个文件夹 ,并将图像存储为有用的东西(例如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)
                }
            }
        }
    }
}

Now we can easily find the profile picture, we can easily delete it: 现在我们可以轻松找到个人资料图片,可以轻松删除它:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM