ios - 创建未知类型的图像格式是一个错误没有上传图像。 swift

标签 ios swift xcode firebase image-uploading

我试图让用户上传图像并创建一个帐户。然而,在选择图像之后,用户应该选择“创建帐户”。但是程序停止了,之后什么也不做。然后这条消息出现在编译器中,'Creating an image format with an unknown type is an error did not upload image.'

这是代码。

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)
}
}

抱歉,如果这太多了,但我不确定在哪里指出这个错误,因为 Xcode 没有将它显示为错误。似乎解决方案可能在某处 here但我找不到它。提前致谢。

最佳答案

您可以使用 availableMediaTypes 来确保它只显示有效的图像类型。

        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

然后你也可以检查 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)
    }

关于ios - 创建未知类型的图像格式是一个错误没有上传图像。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867824/

相关文章:

ios - 为什么即使未明确将 View Controller 添加为 subview ,外观方法也会被调用?

ios - 在 Storyboard 上处理阿拉伯语(从右到左)的最佳方式是什么?

ios - dismissModalViewControllerAnimated 已弃用

ios - AVAudioCompressedBuffer 到 UInt8 数组,反之亦然

ios - Xcode AutoLayout,使边距与高度成比例

ios - Apple Store 提交失败并出现错误 ITMS-90046,但关联域不在权利中

ios - 如何使用 UISwipeGestureRecognizer 检测 UITableViewCell 中的滑动事件

ios - 如何将 iOS Swift 应用程序指向 Amazon Web Services 上的 Parse Server?

ios - VIPER 架构可以在单个模块中包含多个 UIViewController 吗?

ios - Objective-C 桥接问题。如何在 Swift 项目中使用 Obj-C 框架?