上传图片时出现iOS版Firebase错误:对象不存在

时间:2017-07-05 18:33:17

标签: ios swift firebase firebase-storage

我正在尝试将图片上传到firebase存储空间,但是在从照片库中选择图片并点击“选择”按钮之前,我收到此错误:

  

“创建具有未知类型的图像格式是错误”

点击“上传”按钮后,我得到“对象不存在”。

Error

这是我的代码:

import UIKit
import Firebase
import FirebaseAuth
import FirebaseStorage
import FirebaseDatabase

class uploadVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    @IBOutlet weak var imgPost: UIImageView!
    @IBOutlet weak var txtPost: UITextView!
    var uuid = NSUUID().uuidString

    override func viewDidLoad() {
        super.viewDidLoad()

        imgPost.isUserInteractionEnabled = true
        let gestureRecognizer = UITapGestureRecognizer(target: self, 
        action: #selector(uploadVC.selectImage))
        imgPost.addGestureRecognizer(gestureRecognizer)
    }

    func selectImage() {
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .photoLibrary
        picker.allowsEditing = true
        present(picker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, 
        didFinishPickingMediaWithInfo info: [String : Any]) {
        imgPost.image = info[UIImagePickerControllerEditedImage] as? 
        UIImage
        self.dismiss(animated: true, completion: nil)
    }

    @IBAction func btnUpload(_ sender: Any) {
        let mediaFolder = Storage().reference().child("media")
        if let data = UIImageJPEGRepresentation(imgPost.image!, 0.5) {
            mediaFolder.child("\(uuid).jpg").putData(data, metadata: nil, 
            completion: { (metadata, error) in
                if error != nil {
                    let alert = UIAlertController(title: "Error", message: 
                    error?.localizedDescription, preferredStyle: 
                    UIAlertControllerStyle.alert)
                    let ok = UIAlertAction(title: "OK", style: 
                    UIAlertActionStyle.cancel, handler: nil)
                    alert.addAction(ok)
                    self.present(alert, animated: true, completion: nil)
                } else {
                    print(metadata?.downloadURL()?.absoluteString)
                }
            })
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我只知道它是如何工作的。 根据带有swift 3的Firebase存储示例,存储首先需要进行身份验证。

参考:Firebase GitHub example

import UIKit
import Photos
import Firebase
import FirebaseAuth
import FirebaseStorage
import FirebaseDatabase

class uploadVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imgPost: UIImageView!
    @IBOutlet weak var txtPost: UITextView!

    var uuid = NSUUID().uuidString
    var storageRef: StorageReference!
    var imageFile: URL?
    var filePath: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        // [START configurestorage]
        storageRef = Storage.storage().reference()
        // [END configurestorage]

        // [START storageauth]
        // Using Cloud Storage for Firebase requires the user be authenticated. Here we are using
        // anonymous authentication.
        if Auth.auth().currentUser == nil {
            Auth.auth().signInAnonymously(completion: { (user: User?, error: Error?) in
                if let error = error {
                    let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
                    let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
                    alert.addAction(ok)
                    self.present(alert, animated: true, completion: nil)
                }
            })
        }
        // [END storageauth]

        imgPost.isUserInteractionEnabled = true
        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(uploadVC.selectImage))
        imgPost.addGestureRecognizer(gestureRecognizer)
    }

    func selectImage() {
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.sourceType = .photoLibrary
        picker.allowsEditing = true
        present(picker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        imgPost.image = info[UIImagePickerControllerEditedImage] as? UIImage
        picker.dismiss(animated: true, completion:nil)
        if #available(iOS 8.0, *), let referenceUrl = info[UIImagePickerControllerReferenceURL] as? URL {
            let assets = PHAsset.fetchAssets(withALAssetURLs: [referenceUrl], options: nil)
            let asset = assets.firstObject
            asset?.requestContentEditingInput(with: nil, completionHandler: { (contentEditingInput, info) in
                self.imageFile = contentEditingInput?.fullSizeImageURL
                self.filePath = "media/" + "\(self.uuid).jpg"
            })
        }
    }

    @IBAction func btnUpload(_ sender: Any) {
        // [START uploadimage]
        self.storageRef.child(filePath!)
            .putFile(from: imageFile!, metadata: nil) { (metadata, error) in
                if let error = error {
                    let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
                    let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
                    alert.addAction(ok)
                    self.present(alert, animated: true, completion: nil)
                    return
                }
                print(metadata?.downloadURL()?.absoluteString ?? "nothing")
        }
        // [END uploadimage]
    }
}