简体   繁体   中英

Creating an image format with an unknown type is an error did not upload image. Swift

Im trying to have users upload an Image and create an account. After the image is selected however, the user is then supposed to select, 'create account'. But the program is halted and does nothing after that. Then this message shows up in the compiler, 'Creating an image format with an unknown type is an error did not upload image.'

Here is the code.

import UIKit
import Firebase
import FirebaseDatabase
import FirebaseStorage
import SwiftKeychainWrapper

class SignUpVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var userImagePicker: UIImageView!
@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var signUpBtn: UIButton!

var userUid: String!
var emailField: String!
var passwordField: String!
var imagePicker: UIImagePickerController!
var imageSelected = false
var username: String!




override func viewDidLoad() {
    super.viewDidLoad()

    imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.allowsEditing = true
}

override func viewDidDisappear(_ animated: Bool) {

    if let _ = KeychainWrapper.standard.string(forKey: "uid") {
        performSegue(withIdentifier: "toMessage", sender: nil)
    }
}

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

    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        userImagePicker.image = image
        imageSelected = true

    } else {

        print("image wasnt selected")
    }
    imagePicker.dismiss(animated: true, completion: nil)
}

func setUser(img: String) {
    let userData = [
    "username": username!,
    "userImg": img
    ]

    KeychainWrapper.standard.set(userUid, forKey: "uid")

    let location = Database.database().reference().child("users").child(userUid)

    location.setValue(userData)
        dismiss(animated: true, completion: nil)

}
func uploadImg() {
    if usernameField.text == nil {
        signUpBtn.isEnabled = false
    }  else {
            username = usernameField.text
            signUpBtn.isEnabled = true
    }
    guard let img = userImagePicker.image, imageSelected == true else {
        print("image needs to be selected")
        return
    }
    if let imgData = UIImageJPEGRepresentation(img, 0.2) {
        let imgUid = NSUUID().uuidString
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpeg"

        Storage.storage().reference().child(imgUid).putData(imgData, metadata: metadata) { (metadata, error) in
            if error != nil {
                print ("did not upload image")
            } else {
                print("uploaded")
                let downloadURL = metadata?.downloadURL()?.absoluteString
                if let url = downloadURL {
                    self.setUser(img: url)
                }
            }
        }
    }
}

@IBAction func createAccount (_ sender: AnyObject) {
    Auth.auth().createUser(withEmail: emailField, password: passwordField, completion: {(user, error) in
        if error != nil {
            print("Cant create user")
        } else {
            if let user = user {
                self.userUid = user.uid
            }
        }
        self.uploadImg()

    })
}

@IBAction func selectedImgPicker (_ sender: AnyObject) {
    present(imagePicker, animated: true, completion: nil)
}

@IBAction func cancel (_ sender: AnyObject) {
    dismiss(animated: true, completion: nil)
}
}

Sorry if this is too much, but I'm not exactly sure where to pin point this error since Xcode isn't showing it as an error. It seems as if the solution could be somewhere here but I am having trouble finding it. Thanks in advance.

You can use availableMediaTypes to make sure it only shows the valid image types.

        let type = kUTTypeImage as String
        let imagePicker = UIImagePickerController()

        if UIImagePickerController.isSourceTypeAvailable(.camera) {                
            if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {                    
                if availableTypes.contains(type) {                        
                    imagePicker.mediaTypes = [type]
                    imagePicker.sourceType = UIImagePickerControllerSourceType.camera
                }
            }
        } else {
            return
        }

        imagePicker.allowsEditing = true
        imagePicker.showsCameraControls = true
        imagePicker.delegate = self

Then you might also check UIImagePickerControllerOriginalImage

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

        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage ?? info[UIImagePickerControllerEditedImage] as? UIImage {
            userImagePicker.image = image
            imageSelected = true
        } else {
            print("image wasnt selected")
        }
        imagePicker.dismiss(animated: true, completion: nil)
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM