Reputation: 3189
I am trying to upload an image to firebase storage, but I am getting this error after selecting an image from photo library and before clicking “choose” button:
“Creating an image format with an unknown type is an error”
Also I am getting “object does not exist” after clicking “upload” button.
Here's my code:
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)
}
})
}
}
}
Upvotes: 1
Views: 889
Reputation: 3189
I just figured out how it works. According to Firebase storage sample with swift 3, the storage requires authentication first.
Reference: Firebase GitHub example
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]
}
}
Upvotes: 1