Как загрузить изображение в Firestore в swift - PullRequest
0 голосов
/ 13 января 2020

Привет, как я могу загрузить выбранное изображение из галереи в 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-адрес изображения и затем отобразить его. С помощью этого кода я могу позволить пользователю выбрать изображение из своей галереи, но как я могу загрузить его, например, нажав кнопку загрузки? Спасибо !

1 Ответ

1 голос
/ 13 января 2020

Сначала импортируйте 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...