如何从 Firebase 存储中删除照片
How to delete a photo from Firebase Storage
我正在开发一个用户可以登录的应用程序,在用户个人资料页面中,用户可以选择要在我的应用程序中显示的图像个人资料。此图像上传到 Firebase 数据库并存储在 Firebase 存储中。
我希望用户可以根据需要决定删除他当前的图像配置文件。
我找不到办法,如何从 Firebase 存储中删除他的图像,我使用元数据将其放入存储中。
这是我在 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)
}
如果添加按钮"Delete photo",如何删除此图片?如何在 Firebase 存储中检索此图像?我无法找到正确的图像并将其删除,而且我真的不知道如何在 Firebase 存储中创建文件夹,所以所有用户图像都在存储的同一部分中,我无法检索右图 (imageUid).
要删除图像,您需要能够重新创建图像的路径。这意味着知道图像的文件名。
此时保存图像时,您是在为每个图像分配一个随机 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
}
}
}
我正在开发一个用户可以登录的应用程序,在用户个人资料页面中,用户可以选择要在我的应用程序中显示的图像个人资料。此图像上传到 Firebase 数据库并存储在 Firebase 存储中。 我希望用户可以根据需要决定删除他当前的图像配置文件。 我找不到办法,如何从 Firebase 存储中删除他的图像,我使用元数据将其放入存储中。
这是我在 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)
}
如果添加按钮"Delete photo",如何删除此图片?如何在 Firebase 存储中检索此图像?我无法找到正确的图像并将其删除,而且我真的不知道如何在 Firebase 存储中创建文件夹,所以所有用户图像都在存储的同一部分中,我无法检索右图 (imageUid).
要删除图像,您需要能够重新创建图像的路径。这意味着知道图像的文件名。
此时保存图像时,您是在为每个图像分配一个随机 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
}
}
}