将图像和帖子上传到Firebase 5数据库时出现问题

时间:2018-09-07 18:04:58

标签: ios firebase firebase-realtime-database swift4

我目前正在尝试上传照片网址并将标题发布到我的Firebase数据库中。这些照片目前正在保存在Firebase存储中,这很好,但是我希望它也出现在Firebase数据库中。 我反复发现自己正在处理此错误“类型为'StorageMetadata'的值没有成员'downloadURL'” 我了解在Firebase 5中,要从存储获取URL,您需要在存储引用而非元数据上调用downloadURL。我尝试了多种方法和示例,但是所有这些都会导致错误。screenshot of error

 @IBOutlet weak var photo: UIImageView!
@IBOutlet weak var captionTextView: UITextView!
@IBOutlet weak var removeButton: UIBarButtonItem!
@IBOutlet weak var shareButton: UIButton!
var selectedImage: UIImage?
override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto)); photo.addGestureRecognizer(tapGesture)
    photo.isUserInteractionEnabled = true
}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    handlePost()
}

func handlePost() {
    if selectedImage != nil {
       self.shareButton.isEnabled = true
        self.removeButton.isEnabled = true
        self.shareButton.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
    }else{
        self.shareButton.isEnabled = false
        self.shareButton.backgroundColor = .lightGray
        self.removeButton.isEnabled = false


    }
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)

}
@objc func handleSelectPhoto() {
    let pickerController = UIImagePickerController()
    pickerController.delegate = self
    present(pickerController, animated: true, completion: nil)

}
@IBAction func shareButton_TouchUpInside(_ sender: Any) {
    view.endEditing(true)
    let hud = JGProgressHUD(style: .dark)
    hud.textLabel.text = "Loading"
    hud.show(in: self.view)
    hud.dismiss(afterDelay: 3.0)

    if let profileImg = self.selectedImage, let imageData = UIImageJPEGRepresentation(profileImg, 0.1) {
        let photoIdString = NSUUID().uuidString
    let storageRef = Storage.storage().reference(forURL: ".......").child("posts").child(photoIdString)
        storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
            if error != nil {
                return
            }

            //let photoUrl = url?.absoluteString
            let photoUrl = metadata?.downloadURL()?.absoluteString


            self.sendDataToDatabase(photoUrl: photoUrl!)
    }
    )}
}
@IBAction func remove_TouchUpInside(_ sender: Any) {
   clean()
   handlePost()
}
func sendDataToDatabase(photoUrl: String) {
    let ref = Database.database().reference()
    let postsReference = ref.child("posts")
     let newPostId = postsReference.childByAutoId().key

    let newPostReference =  postsReference.child(newPostId)
    newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
        (error, ref) in
        if error != nil {
            ProgressHUD.showError(error!.localizedDescription)
            return
        }
        ProgressHUD.showSuccess("Success")
        self.clean()
      self.tabBarController?.selectedIndex = 0 // switches user back to selected tabbar 0 = first 1 = second etc.
    })

}
func  clean() {
    self.captionTextView.text = ""
    self.photo.image = UIImage(named:"placeholder-photo")
    self.selectedImage = nil
  }
}
 extension CameraViewController: UIImagePickerControllerDelegate, 
UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, 
didFinishPickingMediaWithInfo info: [String : Any]) {
    print("did finish picking media")
    if let image = info["UIImagePickerControllerOriginalImage"] 
as? UIImage {
        selectedImage = image
        photo.image = image
    }
    // profileImage.image = infoPhoto
    dismiss(animated: true, completion: nil)
 }
}

1 个答案:

答案 0 :(得分:0)

import UIKit
import ProgressHUD
import FirebaseStorage
import FirebaseDatabase

class CameraViewController: UIViewController {

    @IBOutlet weak var photo: UIImageView!
    @IBOutlet weak var shareButton: UIButton!
    @IBOutlet weak var captionTextView: UITextView!

    @IBOutlet weak var removeButton: UIBarButtonItem!
    var selectedImage: UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture                           = UITapGestureRecognizer(target: self, action: #selector(self.handleSelectPhoto))
        photo.addGestureRecognizer(tapGesture)
        photo.isUserInteractionEnabled           = true
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
         handlePost()
    }


    func handlePost(){
        if selectedImage != nil {
            self.shareButton.isEnabled          = true
            self.removeButton.isEnabled         = true
            self.shareButton.backgroundColor    = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
        } else {
            self.shareButton.isEnabled          = false
            self.removeButton.isEnabled         = false
            self.shareButton.backgroundColor    = .lightGray

        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
    }

    @objc func handleSelectPhoto(){
        let pickerController                   = UIImagePickerController()
        pickerController.delegate              = self
        present(pickerController, animated: true, completion: nil)

    }


    // Share photos to the storage database
    @IBAction func shareButton_TouchUpInside(_ sender: Any) {
        view.endEditing(true)
        ProgressHUD.show("Please wait...", interaction: false)
        if let profileImg                     = self.selectedImage, let photoData = profileImg.jpegData(compressionQuality: 0.1) {

            let photoIdString                 = NSUUID().uuidString
            print(photoIdString)
            let storageRef                    = Storage.storage().reference(forURL:Config.STORAGE_ROOT_REF).child("Posts").child(photoIdString)
            storageRef.putData(photoData, metadata: nil, completion: { (metadata, error) in
                if error != nil  {
                    ProgressHUD.showError(error!.localizedDescription)

                    return
                }
                let photoUrl = metadata?.downloadURL()?.absoluteString
                self.sendDataToDatabase(photoUrl: photoUrl!)
            })

        } else {
            ProgressHUD.showError("Profile image can't be empty")
        }
    }


    @IBAction func remove_touchUpInside(_ sender: Any) {

        clean()
        handlePost()
    }

    func sendDataToDatabase(photoUrl:String){

            let ref                        = Database.database().reference()
            let postsReference             = ref.child("posts")
            let newPostId                  = postsReference.childByAutoId().key
            let newPostReference           = postsReference.child(newPostId)
        newPostReference.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: {
            (error, ref) in
            if error != nil{
                ProgressHUD.showError(error!.localizedDescription)
                return
            }
            ProgressHUD.showSuccess("Success")
            self.clean()
            self.tabBarController?.selectedIndex  = 0

        })
    }

    func clean(){
        self.captionTextView.text       = ""
        self.photo.image                = UIImage(named: "placeholder-img")
        self.shareButton                = nil
    }
}

extension CameraViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {

   func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        print("did Finish picking media")
       if let chosenImage = info[.originalImage] as? UIImage {

        selectedImage                  = chosenImage
        photo.image                    = chosenImage

        }

        dismiss(animated: true, completion: nil)
    }
}

使用上述代码,它将成功上传图像并将其发布到Firebase数据库