将图像上传到firebase存储的问题

时间:2018-02-18 07:22:44

标签: ios swift firebase firebase-realtime-database firebase-storage

我正在尝试编写一个允许用户设置新配置文件图像的功能,新图像将被上传,旧图像将从firebase存储中删除。

我有两个功能可以执行此操作并且它们可以单独工作,但是如果我在删除功能之后运行上传,则新图像将无法上传,即使我在控制台中收到成功消息,也不会在存储中显示任何内容。理想情况下,我想首先删除并设置新图像,我尝试过多种方式;完成处理程序,添加延迟但没有任何工作。我现在甚至有两个按钮,一个控制每个功能来测试这个,但这仍然无法正常工作。我错过了什么?任何帮助都会很棒,因为我花了几个小时用这个绞尽脑汁!

Here is my complete code for the VC: 

//
//  LandingVC.swift
//  Login
//
//  Created by George Woolley on 07/11/2017.
//  Copyright © 2017 George Woolley. All rights reserved.
//

import UIKit
import FBSDKLoginKit
import SwiftKeychainWrapper
import Firebase


class MyAccountVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var profilePictureImg: UIImageView!
    @IBOutlet weak var usernameField: UILabel!
    @IBOutlet weak var saveButton: UIButton!

    @IBOutlet weak var changeProfilePicButton: UIButton!

    let picker = UIImagePickerController()
    let myUID = KeychainWrapper.standard.string(forKey: "uid")

    override func viewDidLoad() {
        super.viewDidLoad()

        picker.delegate = self


        if myUID == nil {
            print("You are not logged in")
        } else {

            let ref = DataService.ds.DBCurrentUser
            ref.child("MyDetails").observe(.value, with: { (snapshot) in

                if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
                    for snap in snapshots {
                        if snap.key == "username" {
                            self.usernameField.text = snap.value as? String
                        }
                        if snap.key == "profileImageURL" {
                            if let url = snap.value as? String {
                                let ref = Storage.storage().reference(forURL: url)
                                ref.getData(maxSize:  2 * 1024 * 1024, completion: { (data, error) in
                                    if error != nil {
                                        print("An error has occured downloading image")
                                    } else {
                                        print("Image downloaded")
                                        if let imageData = data {
                                            if let img = UIImage(data: imageData) {
                                                self.profilePictureImg.image = img

                                            }
                                        }
                                    }
                                })
                            }

                        }

                    }
                }
           })
        }


    }



    func removeImgFromFirebaseStorage() {

        let ref = DataService.ds.DBCurrentUser.child("MyDetails")
        ref.observe(.value) { (snapshot) in
            if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshots {
                    if snap.key == "profileImageURL" {
                        if let url = snap.value as? String {
                            let img = Storage.storage().reference(forURL: url)
                            img.delete(completion: { (error) in
                                if error != nil {
                                    print("Error is \(String(describing: error))")
                                } else {
                                        print("Success")
                                }

                            })
                        }
                    }
                }
            }
        }

        saveButton.isHidden = false
        changeProfilePicButton.isHidden = true

    }




    func uploadImageToFirebase() {
        if let imageToUpload = profilePictureImg.image {
            if let imageData = UIImageJPEGRepresentation(imageToUpload, 0.2) {

                let metaData = StorageMetadata()
                metaData.contentType = "image/jpeg"
                let imageUID = UUID().uuidString
                DataService.ds.StorageProfile.child(imageUID).putData(imageData, metadata: metaData, completion: { (metadata, error) in
                    if error != nil {
                        print("Error occured uploading profile image")
                    } else {
                        print("Sucess")
                        if let downloadURL = metadata?.downloadURL()?.absoluteString {
                            DataService.ds.DBCurrentUser.child("MyDetails").child("profileImageURL").setValue(downloadURL)

                        }
                    }


                })

            }
        }

        saveButton.isHidden = true
        changeProfilePicButton.isHidden = false

    }


    @IBAction func saveButonPressed(_ sender: Any) {
        uploadImageToFirebase()
    }

    @IBAction func changeProfilePicturePressed(_ sender: Any) {
        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        present(picker, animated: true, completion: nil)
    }




    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        profilePictureImg.contentMode = .scaleAspectFill
        profilePictureImg.image = chosenImage
        dismiss(animated: true, completion: removeImgFromFirebaseStorage)

    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)

    }

    @IBAction func logOffPressed(_ sender: Any) {

        KeychainWrapper.standard.removeObject(forKey: "uid")
        performSegue(withIdentifier: "loginVC", sender: nil)
        let fbLogin = FBSDKLoginManager()
        fbLogin.logOut()

        try! Auth.auth().signOut()
    }
}

0 个答案:

没有答案