首页 > 解决方案 > 如何快速将图像上传到 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,然后渲染它。使用此代码,我可以让用户从他的画廊中选择一张图片,但是当我按下上传按钮时如何上传它?谢谢 !

标签: swiftfirebasegoogle-cloud-firestore

解决方案


首先导入 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)
}

推荐阅读