简体   繁体   English

从Firebase上传和检索照片

[英]Upload and retrieve photo from Firebase

I have built and application which shows in UITableView data of books. 我已经建立并在UITableView中显示书籍数据的应用程序。 All works perfectly, the only thing I need is the book's photo. 一切都很完美,我唯一需要的就是书的照片。 To upload and retrieve photo I use Firebase but I don't have idea how do it with photos. 要上传和检索照片,我使用Firebase,但我不知道如何处理照片。

This is what I have implemented: 这是我实现的:

@IBAction func ButtonScatta(_ sender: UIButton) {

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera;
        imagePicker.allowsEditing = false
        self.present(imagePicker, animated: true, completion: nil)
    }

}

@IBAction func ButtonScegli(_ sender: UIButton) {

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary;
        imagePicker.allowsEditing = true
        self.present(imagePicker, animated: true, completion: nil)
    }

}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [AnyHashable: Any]!) {
    ImageView.image = image
    self.dismiss(animated: true, completion: nil);
}

And this is the function of the button "Vendi": 这是按钮“ Vendi”的功能:

if let user = FIRAuth.auth()?.currentUser{

        self.emailUser.text = user.email
        let userID: String = user.uid
        let x = libriArray.count
        let y = String(x+1)
        //let imageLibro: UIImage = self.ImageView.image!
        let emailVenditore: String = self.emailUser.text!
        let titoloLibro: String = self.TitoloText.text!
        let codiceLibro: String = self.ISBNText.text!
        let prezzoLibro: String = self.PrezzoText.text!
        let edizioneLibro: String = self.EdizioneText.text!
        let statoLibro: Bool = false

        let Libro = ["titolo": titoloLibro, "codice": codiceLibro, "prezzo": prezzoLibro, "autore": edizioneLibro, "emailUser": emailVenditore, "userID": userID, "stato": statoLibro] as [String : Any]

        let libriRef = ref.child(byAppendingPath: "Libri")

        var libri = [y: Libro]
        libriRef.childByAutoId().setValue(Libro)

        self.dismiss(animated: true, completion: nil)

    }  else {

    }

Can someone write and explain how to do the upload and retrieve of this photos? 有人可以撰写和解释如何上传和检索这些照片吗?

I have a hard time tracing what you're doing exactly with those var names. 我很难找到这些var名称在做什么。 However, I'm assuming you got the UIImage from the imagePickerController. 但是,我假设您从imagePickerController获得了UIImage

You will need Firebase Storage ( pod 'Firebase/Storage' ) and import FirebaseStorage in the respective file. 您将需要Firebase Storage( pod 'Firebase/Storage' )并在相应文件中import FirebaseStorage

Here's what you can do to upload the UIImage to Firebase Storage: UIImage上传到Firebase存储的方法如下:

func uploadPhoto(_ image: UIImage, completionBlock: @escaping () -> Void) {
    let ref = FIRStorage.storage().reference().child("myCustomPath").child("myFileName.jpg")    // you may want to use UUID().uuidString + ".jpg" instead of "myFileName.jpg" if you want to upload multiple files with unique names

    let meta = FIRStorageMetadata()
    meta.contentType = "image/jpg"

    // 0.8 here is the compression quality percentage
    ref.put(UIImageJPEGRepresentation(image, 0.8)!, metadata: meta, completion: { (imageMeta, error) in
        if error != nil {
            // handle the error
            return
        }

        // most likely required data
        let downloadURL = imageMeta?.downloadURL()?.absoluteString      // needed to later download the image
        let imagePath = imageMeta?.path     // needed if you want to be able to delete the image later

        // optional data
        let timeStamp = imageMeta?.timeCreated
        let size = imageMeta?.size

        // ----- should save these data in your database at this point -----

        completionBlock()
    })

}

This is a simple function that can upload a UIImage to Firebase Storage. 这是一个简单的功能,可以将UIImage上传到Firebase Storage。 Note that you should keep track of the downloadURL and the path of every image you upload. 请注意,您应该跟踪downloadURL和上载的每个图像的路径。 You can save them in the database after any upload. 您可以在上传后将它们保存在数据库中。

To download an image you uploaded, you can do something like this: 要下载您上传的图片,您可以执行以下操作:

func retrieveImage(_ URL: String, completionBlock: @escaping (UIImage) -> Void) {
    let ref = FIRStorage.storage().reference(forURL: URL)

    // max download size limit is 10Mb in this case
    ref.data(withMaxSize: 10 * 1024 * 1024, completion: { retrievedData, error in
        if error != nil {
            // handle the error
            return
        }

        let image = UIImage(data: retrievedData!)!

        completionBlock(image)

    })
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM