簡體   English   中英

圖像不會上傳到 Firebase 存儲,迅速

[英]Image doesn't upload to firebase storage, swift

這是代碼

import UIKit
import Photos
import Firebase
import FirebaseStorage

class SignUpViewController: UIViewController {

    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var errorLabel: UILabel!
    @IBOutlet weak var tapToChangeButton: UIButton!
    @IBOutlet weak var profileImageView: UIImageView!
    
    var imagePickerController = UIImagePickerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        userNameTextField.backgroundColor = .clear
        userNameTextField.layer.cornerRadius = 27
        userNameTextField.layer.borderWidth = 1
        userNameTextField.layer.borderColor = UIColor.systemGreen.cgColor
        
        emailTextField.backgroundColor = .clear
        emailTextField.layer.cornerRadius = 27
        emailTextField.layer.borderWidth = 1
        emailTextField.layer.borderColor = UIColor.systemGreen.cgColor
        
        passwordTextField.backgroundColor = .clear
        passwordTextField.layer.cornerRadius = 27
        passwordTextField.layer.borderWidth = 1
        passwordTextField.layer.borderColor = UIColor.systemGreen.cgColor
        
        let imageTap = UITapGestureRecognizer(target: self, action: #selector(openImagePicker))
        profileImageView.isUserInteractionEnabled = true
        profileImageView.addGestureRecognizer(imageTap)
        profileImageView.layer.cornerRadius = profileImageView.bounds.height / 2
        profileImageView.clipsToBounds = true
        tapToChangeButton.addTarget(self, action: #selector(openImagePicker), for: .touchUpInside)
        
        imagePickerController = UIImagePickerController()
        imagePickerController.allowsEditing = true
        imagePickerController.sourceType = .photoLibrary
        imagePickerController.delegate = self
        
        checkPermissions()
    }
    
    @objc func openImagePicker(_ sender:Any) {
        // Open Image Picker
        self.present(imagePickerController, animated: true, completion: nil)
    }
    
    func checkPermissions() {
        if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
            PHPhotoLibrary.requestAuthorization({ (status:
                PHAuthorizationStatus) -> Void in
                ()
            })
        }
        
        if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized {
        } else {
            PHPhotoLibrary.requestAuthorization(requestAuthorizationHandler)
        }
    }
    
    func requestAuthorizationHandler(status: PHAuthorizationStatus) {
        if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized {
            print("Have authorization")
        } else {
            print("Authorization declined")
        }
    }

按下注冊按鈕后,uploadToCloud 功能應該被執行,但我不知道如何從圖片選擇器中獲取 url

    @IBAction func signupPressed(_ sender: UIButton) {
        
            guard let username = self.userNameTextField.text, username.count > 3 else {
                self.errorLabel.text = "Please enter a valid username"
                return
            }

            guard let password = passwordTextField.text else {
                self.errorLabel.text = "Please enter a valid password"
                return
            }

            guard let email = emailTextField.text else {
                self.errorLabel.text = "Please enter a valid email"
                return
            }

            
            Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
                if let e = error {
                    self.errorLabel.text = e.localizedDescription
                } else {
                    //Navigate to the ChatViewController
                    let db = Firestore.firestore()
                    
                    db.collection("users").addDocument(data: ["username": username, "uid": authResult!.user.uid]) { (error) in
                        if let e = error {
                            // You may not want to show this error to the user but you should still show a "sanitised" error so that it doesn't leak information.
                            self.errorLabel.text = e.localizedDescription
                        } else {
                            self.performSegue(withIdentifier: "goToMap", sender: self)
                        }
                    }
                }
            }
        }
    
    func uploadToCloud(fileURL: URL) {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let storage = Storage.storage()
        
        let data = Data()
        
        let storageRef = storage.reference()
        
        let localFile = fileURL
        
        let photoRef = storageRef.child("users/\(uid)")
        
        let uploadTask = photoRef.putFile(from: localFile, metadata: nil) { (metadata, error) in
            guard let metadata = metadata else {
                self.errorLabel.text = error?.localizedDescription
                return
            }
            metadata.contentType = "image/jpg"
        }
    }
    
}

extension SignUpViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        if let pickedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
            self.profileImageView.image = pickedImage
        }
        
        if let url = info[UIImagePickerController.InfoKey.imageURL] as? URL {
            uploadToCloud(fileURL: url)
        }
        
        picker.dismiss(animated: true, completion: nil)
    }
}

我不太明白您的問題,但我認為問題在於您的 uploadToCloud 功能。

這是你函數的另一個版本,對我來說更容易

func uploadToCloud(with profileImage:UIImage){

    let storage = Storage.storage().reference()
    guard let uid = Auth.auth().currentUser?.uid else { return }
    guard  let imageData = profileImage.pngData() else{
        return
    }
    storage.child("users/\(uid)").putData(imageData, metadata: nil) { (StorageMetadata, error) in
        guard StorageMetadata != nil else{
            print("oops an error occured while data uploading")
            return
        }
             print("Image sent")
        }
        
    }

暫無
暫無

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

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