我正在尝试将图片上传到firebase存储空间,但是在从照片库中选择图片并点击“选择”按钮之前,我收到此错误:
“创建具有未知类型的图像格式是错误”
点击“上传”按钮后,我得到“对象不存在”。
这是我的代码:
import UIKit
import Firebase
import FirebaseAuth
import FirebaseStorage
import FirebaseDatabase
class uploadVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imgPost: UIImageView!
@IBOutlet weak var txtPost: UITextView!
var uuid = NSUUID().uuidString
override func viewDidLoad() {
super.viewDidLoad()
imgPost.isUserInteractionEnabled = true
let gestureRecognizer = UITapGestureRecognizer(target: self,
action: #selector(uploadVC.selectImage))
imgPost.addGestureRecognizer(gestureRecognizer)
}
func selectImage() {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : Any]) {
imgPost.image = info[UIImagePickerControllerEditedImage] as?
UIImage
self.dismiss(animated: true, completion: nil)
}
@IBAction func btnUpload(_ sender: Any) {
let mediaFolder = Storage().reference().child("media")
if let data = UIImageJPEGRepresentation(imgPost.image!, 0.5) {
mediaFolder.child("\(uuid).jpg").putData(data, metadata: nil,
completion: { (metadata, error) in
if error != nil {
let alert = UIAlertController(title: "Error", message:
error?.localizedDescription, preferredStyle:
UIAlertControllerStyle.alert)
let ok = UIAlertAction(title: "OK", style:
UIAlertActionStyle.cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
} else {
print(metadata?.downloadURL()?.absoluteString)
}
})
}
}
}
答案 0 :(得分:0)
我只知道它是如何工作的。 根据带有swift 3的Firebase存储示例,存储首先需要进行身份验证。
import UIKit
import Photos
import Firebase
import FirebaseAuth
import FirebaseStorage
import FirebaseDatabase
class uploadVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imgPost: UIImageView!
@IBOutlet weak var txtPost: UITextView!
var uuid = NSUUID().uuidString
var storageRef: StorageReference!
var imageFile: URL?
var filePath: String?
override func viewDidLoad() {
super.viewDidLoad()
// [START configurestorage]
storageRef = Storage.storage().reference()
// [END configurestorage]
// [START storageauth]
// Using Cloud Storage for Firebase requires the user be authenticated. Here we are using
// anonymous authentication.
if Auth.auth().currentUser == nil {
Auth.auth().signInAnonymously(completion: { (user: User?, error: Error?) in
if let error = error {
let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
}
})
}
// [END storageauth]
imgPost.isUserInteractionEnabled = true
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(uploadVC.selectImage))
imgPost.addGestureRecognizer(gestureRecognizer)
}
func selectImage() {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
imgPost.image = info[UIImagePickerControllerEditedImage] as? UIImage
picker.dismiss(animated: true, completion:nil)
if #available(iOS 8.0, *), let referenceUrl = info[UIImagePickerControllerReferenceURL] as? URL {
let assets = PHAsset.fetchAssets(withALAssetURLs: [referenceUrl], options: nil)
let asset = assets.firstObject
asset?.requestContentEditingInput(with: nil, completionHandler: { (contentEditingInput, info) in
self.imageFile = contentEditingInput?.fullSizeImageURL
self.filePath = "media/" + "\(self.uuid).jpg"
})
}
}
@IBAction func btnUpload(_ sender: Any) {
// [START uploadimage]
self.storageRef.child(filePath!)
.putFile(from: imageFile!, metadata: nil) { (metadata, error) in
if let error = error {
let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
return
}
print(metadata?.downloadURL()?.absoluteString ?? "nothing")
}
// [END uploadimage]
}
}