swift - 如何快速将图像上传到 Firestore
问题描述
嗨,我如何将从图库中选择的图像上传到 Firestore?
import UIKit
import FirebaseStorage
class HomeViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var image: UIImageView!
let imagePicker = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
image.makeRoundCorners(byRadius: 20)
image.image = UIImage(named: ("upload")) //Default image
}
@IBAction func choose(_ sender: Any) {
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let imageV = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
image.image = imageV
}
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
{
picker.dismiss(animated: true, completion:nil)
}
@IBAction func upload(_ sender: Any) {
}
}
extension UIImageView {
func makeRoundCorners(byRadius rad: CGFloat) {
self.layer.cornerRadius = rad
self.clipsToBounds = true
}
}
我想把它上传到 Firestore,这样我就可以检索图像的 url,然后渲染它。使用此代码,我可以让用户从他的画廊中选择一张图片,但是当我按下上传按钮时如何上传它?谢谢 !
解决方案
首先导入 FirebaseFirestore。
import FirebaseFirestore
然后您可以访问 FireStore,首先 (1) 将图像上传到商店,然后 (2) 获取 URL 以访问图像。
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
let storage = Storage.storage().reference()
storage.child("images").putData(imageV.jpegData(compressionQuality: 0.4), metadata: metadata) { meta, error in
if let error = error {
print(error)
return
}
storage.child(folder).downloadURL { url, error in
if let error = error {
// Handle any errors
print(error)
}
}
}
我喜欢有一个 UIImage 的扩展来这样做:
extension UIImage {
func upload(with folder: String, completion: @escaping (URL?) -> Void) {
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
//let fileName = [UUID().uuidString, String(Date().timeIntervalSince1970)].joined()
let data = self.jpegData(compressionQuality: 0.4)
let storage = Storage.storage().reference()
storage.child(folder).putData(data, metadata: metadata) { meta, error in
if let error = error {
print(error)
completion(nil)
return
}
storage.child(folder).downloadURL { url, error in
if let error = error {
// Handle any errors
print(error)
completion(nil)
}
else {
completion(url)
}
}
}
}
}
然后像这样称呼它
imageV.upload(with: "images", completion: { (url: URL?) in
print(url)
}
推荐阅读
- android - 增加音频文件某些部分的音量
- javascript - 我很困惑什么数据类型会命名?函数数据类型或布尔数据类型,因为它会返回布尔值?
- java - 从内部类中访问局部变量问题;需要声明为final
- reactjs - 在任一上下文中都找不到“商店”
- matrix - 在 r 中使用 geohashes 构建二进制矩阵
- matlab - 这些 Matlab 内置的 Poisson pmf 中哪个最准确?
- php - Wordpress - 如何在预览中只显示两个句子 the_excerpt
- typescript - 打字稿阻止从项目中的某些目录导入
- laravel - (Laravel)通过数据透视表的多态关系
- events - 在事件驱动架构中,是否可以让所有服务将它们的事件发送到一个组件,然后再将其转发给适当的服务?