簡體   English   中英

上載圖片時iOS的Firebase錯誤:對象不存在

[英]Firebase for iOS error when uploading an image: object does not exist

我正在嘗試將圖像上傳到Firebase存儲中,但是在從照片庫中選擇圖像之后並單擊“選擇”按鈕之前,出現了此錯誤:

“創建未知類型的圖像格式是錯誤的”

另外,單擊“上傳”按鈕后,我得到“對象不存在”的信息。

錯誤

這是我的代碼:

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)
                }
            })
        }
    }
}

我只是想出了它是如何工作的。 根據Swift 3的Firebase存儲示例,該存儲首先需要進行身份驗證。

參考: Firebase GitHub示例

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]
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM