将图片上传到Firebase存储和数据库

14

我想将图像的下载URL放入我的Firebase数据库中。我可以将图像上传到存储中,但不知道如何将URL与其余“帖子”一起放入数据库中。

@IBOutlet weak var titleText: UITextField!
@IBOutlet weak var authorText: UITextField!
@IBOutlet weak var mainText: UITextView!
@IBOutlet weak var dateText: UITextField!
@IBOutlet weak var myImageView: UIImageView!

var ref:FIRDatabaseReference?

override func viewDidLoad() {
    super.viewDidLoad()

    ref = FIRDatabase.database().reference()

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


@IBAction func uploadImage(_ sender: Any) {


       let image = UIImagePickerController()
    image.delegate = self
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary

    image.allowsEditing = false

    self.present(image, animated: true)
    {
        //after its completed
    }
}


@objc(imagePickerController:didFinishPickingMediaWithInfo:) func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
        myImageView.image = image

    }
    else
    {
        //error
    }

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

    let storageRef = FIRStorage.storage().reference().child("myImage.png")
    if let uploadData = UIImagePNGRepresentation(self.myImageView.image!){
        storageRef.put(uploadData, metadata: nil, completion:
            {
                (metadata, error) in
                if error != nil {
                    print("error")
                    return
                }

   print(metadata)

   //how do I put the download URL in the metadata into my database

        }  
        )
    }

}

@IBAction func addPost(_ sender: Any) {

    if self.titleText.text != "" && self.authorText.text != "" && self.mainText.text != "" && self.dateText.text != ""
    {

        ref?.child("Posts").childByAutoId().setValue(["Title": titleText.text,"Article": mainText.text, "Author": authorText.text, "Date": dateText.text, "myImageURL": myImageURL])

        //the myImageURL part is where I get an error

        self.performSegue(withIdentifier: "post", sender: self)

    }
    else{

        let alertController = UIAlertController(title: "Oops!", message: "Field left blank", preferredStyle: .alert)

        let defaultAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
        alertController.addAction(defaultAction)

        self.present(alertController, animated: true, completion: nil)

        }
    }
}
5个回答

19

请将您的上传保存函数组织成这样:

func uploadMedia(completion: @escaping (_ url: String?) -> Void) { 
    let storageRef = FIRStorage.storage().reference().child("myImage.png")
    if let uploadData = UIImagePNGRepresentation(self.myImageView.image!) {
        storageRef.put(uploadData, metadata: nil) { (metadata, error) in
            if error != nil {
                print("error")
                completion(nil)
            } else {
                completion((metadata?.downloadURL()?.absoluteString)!)) 
                // your uploaded photo url.
            }
       }
 }

接下来只需连接到FIRDatabase并将其保存到您的节点。

 @IBAction func addPost(_ sender: Any) {
     if self.titleText.text   != "" && self.authorText.text != "" 
        && self.mainText.text != "" && self.dateText.text   != "" {
     
     uploadMedia() { url in 
          guard let url = url else { return }
          ref?.child("Posts").childByAutoId().setValue([
                                "Title"      : titleText.text,
                                "Article"    : mainText.text, 
                                "Author"     : authorText.text, 
                                "Date"       : dateText.text, 
                                "myImageURL" : url
                                ])
     }
 }

您还可以查看我的答案,了解有关上传数据并将URL保存到数据库的信息。


那么我该如何将它放入我的数据库中呢?ref?.child("Posts").childByAutoId().setValue(["Title": titleText.text,"Article": mainText.text, "Author": authorText.text, "Date": dateText.text ]) - Riccardo

10

更新 Firebase 版本和 Swift 4.2 代码:

 func uploadMedia(completion: @escaping (_ url: String?) -> Void) {

    let storageRef = Storage.storage().reference().child("\(Auth.auth().currentUser?.uid ?? "").png")
    if let uploadData = self.imgUploadView.image?.jpegData(compressionQuality: 0.5) {
        storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
            if error != nil {
                print("error")
                completion(nil)
            } else {

                storageRef.downloadURL(completion: { (url, error) in

                    print(url?.absoluteString)
                    completion(url?.absoluteString)
                })

              //  completion((metadata?.downloadURL()?.absoluteString)!))
                // your uploaded photo url.


            }
        }
    }
}

1

100%工作测试仅一个添加功能

 //MARK: - Upload image
func uploadImage(_ image: UIImage){
 
    let imageName:String = String("\(CurrentTimeStampInSecond).png")
    
    let storageRef = Storage.storage().reference().child("profilePic").child(imageName)
    let compressImage = HelperFunction.helper.resizeImage(image: image)
    if let uploadData = UIImagePNGRepresentation(compressImage){
        storageRef.putData(uploadData, metadata: nil
            , completion: { (metadata, error) in
                if error != nil {
                    print("error")
                     self.stopAnimating()
                    showAlertWithTitleWithMessage(message: "Please try again later")
                    return
                }else{
                    self.stopAnimating()
                }
                
                let strPic:String = (metadata?.downloadURL()?.absoluteString)!
                               
                print(metadata)
                //self.imagePath = (metadata?.downloadURL()?.absoluteString)!
                //self.sendMessageOnServer()
                print("\n\n\n\n\n\n ===download url : \(strPic)")
                   
        })
        
    }
}

“StorageMetadata”没有成员“downloadURL”,导致我出现了这个错误。 - Qazi Ammar

0
  Use UIImagePNGRepresentation in swift 4.2 like this,

 if let uploadData = profileImageView.image?.pngData() {
                    storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
                        if error != nil {

                        }
                    }
                }

0

可能已经有点晚了,但我发现使用实用程序类上传图像和文件到Firebase存储是一种更简单的方法。您可以使用上述实用程序类通过单个方法调用上传图像和文件。就像这样

if let data = image.pngData() { // convert your UIImage into Data object using png representation
      FirebaseStorageManager().uploadImageData(data: data, serverFileName: "your_server_file_name.png") { (isSuccess, url) in
             print("uploadImageData: \(isSuccess), \(url)")
       }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接