【问题标题】:Can't upload user picked image to firebase storage and download url to store in database无法将用户选择的图像上传到 Firebase 存储并下载 url 以存储在数据库中
【发布时间】:2020-12-05 15:02:52
【问题描述】:

我正在尝试将用户选择的图片上传到 firebase 存储,然后下载 url,以便可以将图片存储在实时数据库中,但无法让它与我的代码一起使用!我原本打算使用元数据!.downloadUrl() 但由于更新,它不再起作用,所以我迷路了。

这是我的代码:

import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage

class createPostViewController: UIViewController {
    
    
    @IBOutlet weak var profileImage: UIImageView!
    
    @IBOutlet weak var contactEmail: UITextField!
    @IBOutlet weak var contactPhoneNum: UITextField!
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var age: UITextField!
    @IBOutlet weak var gender: UITextField!
    @IBOutlet weak var lastSeen: UITextField!
    @IBOutlet weak var profileDescription: UITextField!
    @IBOutlet weak var postBtn: UIButton!
    
    var imagePicker: UIImagePickerController!
    var selectedImage: UIImage!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(createPostViewController.handleSelect))
        profileImage.addGestureRecognizer(tapGesture)
        imagePicker = UIImagePickerController()
        imagePicker.allowsEditing = true
        imagePicker.delegate = self
        postBtn.layer.cornerRadius = 10
        // Do any additional setup after loading the view.
    }
    
    

    @objc func handleSelect(){
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        present(imagePicker, animated: true, completion: nil)
    }
    
    
    @IBAction func post(_ sender: AnyObject) {
        let userID = Auth.auth().currentUser?.uid
        Database.database().reference().child("profiles").child(userID!).observe(.value, with: { (snapshot) in
            let post: Dictionary<String, AnyObject> = [
               // "userImg":  as AnyObject,
                "name": self.name.text as AnyObject,
                "contactEmail": self.contactEmail.text as AnyObject,
                "contactPhoneNum": self.contactPhoneNum.text as AnyObject,
                "age": self.age.text as AnyObject,
                "gender": self.gender.text as AnyObject,
                "lastSeen": self.lastSeen.text as AnyObject,
                "profileDescription": self.profileDescription.text as AnyObject,
            ]
            
            let firebasePost = Database.database().reference().child("profiles").childByAutoId()
            firebasePost.setValue(post)
        })
        
    }
    
    
    
    func uploadImageToFireBase(image: UIImage) {
        // Create the file metadata
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpeg"
        let storageRef = Storage.storage().reference()
        let profileRef = storageRef.child("images/rivers.jpg")
        // Upload the file to the path FILE_NAME
        Storage.storage().reference().child("FILE_NAME").putData(image.jpegData(compressionQuality: 0.42)!, metadata: metadata) { (metadata, error) in
            guard let metadata = metadata else {
              // Uh-oh, an error occurred!
              print((error?.localizedDescription)!)
              return
            }
            // Metadata contains file metadata such as size, content-type.
            let size = metadata.size
            
            print("Upload size is \(size)")
            print("Upload success")
        }
    }
    

    
    
    //func uploadToCloud(fileURL : URL) {
      //  let storage = Storage.storage()
        
        //let data = Data()
        
        //let storageRef = storage.reference()
        
        //let localFule = fileURL
        
        //let userID = Auth.auth().currentUser?.uid
        
        //let photoRef = storageRef.child("profilePhoto\(userID)")
        
        //let uploadTask = photoRef.putFile(from: localFule, metadata: nil) { (metadata, err) in
          //  guard let metadata = metadata else {
            //    print(err?.localizedDescription)
              //  return
            //}
            //print("Photo Upload")
            
       // }
   // }
}

extension createPostViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image =  info["UIImagePickerControllerEditedImage"]as? UIImage {
            selectedImage = image
             print("success")
              profileImage.image = image
              uploadImageToFireBase(image: selectedImage)
          } else {
              print("image wasnt selected")
          }

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

【问题讨论】:

  • 您的代码中没有任何内容会尝试将 url 存储在 Firebase 实时数据库中,并且您不会从元数据中获取该信息。此外,从您创建的文件引用中获取下载 url 以存储它(例如let riversRef = storageRef.child("images/rivers.jpg"),但也没有其中之一。请查看入门指南Upload from data in Memory,因为它显示了执行此操作的代码。然后更新你的问题与你的实际代码并指出它在哪里不起作用。

标签: ios swift firebase firebase-storage


【解决方案1】:

我认为您仍然可以在存储引用上使用downloadUrl 方法。

func uploadImageToFireBase(image: UIImage) {
    // Create the file metadata
    let metadata = StorageMetadata()
    metadata.contentType = "image/jpeg"
    
    // Upload the file to the path FILE_NAME
    Storage.storage().reference().child("FILE_NAME").putData(image.jpegData(compressionQuality: 0.42)!, metadata: metadata) { (metadata, error) in
        guard let metadata = metadata else {
            print((error?.localizedDescription))
            return
        }
        
        Storage.storage().reference().child("FILE_NAME").downloadURL { (imageUrl, error) in
            if let error = error {
                print("error: ", error.localizedDescription)
                return
            }
            if let userID = Auth.auth().currentUser?.uid {
                let currentUserRef = Database.database().reference().child("profiles").child(userID)
                currentUserRef.updateChildValues(["profileImage": imageUrl])
            }
        }
    }
}

请看this的回答。

【讨论】:

  • 我已经尝试过了,但图像似乎仍然没有上传
  • 上传的图片是否没有出现在 firebase 控制台中的 storage 下。请检查您是否在存储中具有read, write 权限
  • 我使用了断点,我认为函数没有调用
  • 哪个函数没有被调用?
  • uploadImageToFirebase,因为我在函数上放了一个断点,但没有到达。
猜你喜欢
  • 2020-08-09
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2017-10-19
  • 2015-02-19
  • 2021-12-27
相关资源
最近更新 更多