swift - 从 UIImagePicker 将图像上传到 Firebase
问题描述
选择我的 UIImage 选择器后,我想将个人资料图片上传到 Firebase。但我不知道该怎么做,也看不懂文档,因为我是编码新手)。请帮我。我需要将图片上传到 Firebase。它将是用户图片,因此对图片的引用应保存到数据库。
extension ProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
profileImage.image = image
picker.dismiss(animated: true, completion: nil)
}
我不知道如何上传和下载个人资料图片。
解决方案
创建存储引用并添加文件夹名称和图像名称。
Storage.storage().reference().child("id").child("profile.png")
并使用putData:metadata:completion:
方法上传图片。上传图片后,获取图片网址并在用户详细信息中更新。
上传个人资料图片
import FirebaseStorage
import FirebaseAuth
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage, let imageData = image.pngData() {
profileImage.image = image
let storageRef = Storage.storage().reference().child("id").child("profile.png")
let metaData = StorageMetadata()
metaData.contentType = "image/png"
storageRef.putData(imageData, metadata: metaData) { (metaData, error) in
if error == nil, metaData != nil {
storageRef.downloadURL { url, error in
if let url = url {
print(url)//URL of the profile image
self.saveProfileImageUrlInUserDetails(url: url)
}
}
} else {
print(error?.localizedDescription)//upload failed
}
}
}
picker.dismiss(animated: true, completion: nil)
}
在用户详细信息中保存上传的照片参考 更新用户的个人资料
func saveProfileImageUrlInUserDetails(url: URL) {
let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.photoURL = url
changeRequest?.commitChanges(completion: { error in
if error == nil {
//saved
} else {
print(error?.localizedDescription)//failed to udpate
}
})
}
下载个人资料图片
if let profileImgUrl = Auth.auth().currentUser?.photoURL?.absoluteString {
let ref = Storage.storage().reference(forURL: profileImgUrl)
ref.getData(maxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print(error.localizedDescription)
} else if let data = data, let image = UIImage(data: data) {
self.profileImage.image = image
}
}
}
推荐阅读
- django - 即使与数据匹配,Django 过滤器也会返回空查询集
- python - 用 Python 测试 Parquet
- c - 使用只有一个函数参数的递归的对称树检查算法
- python-3.x - 可能是关于 Python 的新手问题。从 Braintree 自动下载时遇到错误
- c# - 在 C# 中的子嵌套 gridview 中编辑行
- java - 将文件表从 excel 文件复制到另一个文件
- java - 当客户端被 IntelliJ 断开连接时,套接字输入流在 readLine 上连续返回 null
- java - 我应该如何在 AsyncTask 中实现 UDP?
- firebase-authentication - 在 iOS 13 上首次登录后,firebase signInWithRedirect 无法正常工作,在 iOS11 和 Android 上工作正常
- c++ - 无法理解 map 的工作方式,将 multiset 设置为 mapped_type