Why .putData does not upload Image in Firebase Storage with Swift?
I have a simple swift App in which the user chooses an image from the Gallery, in addition to entering a few data. By clicking on Save the image chosen should be uploaded into Firestore Storage. I implemented the same logic described here https://firebase.google.com/docs/storage/ios/upload-files. When I call the ".putData(data, metadata: nil)" nothing happens and no error is given back. Here is the code snippet:
func uploadImage(imageView: UIImageView) -> String { // Variable for my image url var urlString: String urlString = "" storage = Storage.storage() guard let image = imageView.image, let imageData = image.jpegData(compressionQuality: 1.0) else { print ("no image uploaded") return "" } let imageName = String (Int64((NSDate().timeIntervalSince1970 * 1000.0).rounded())) + ".jpg" let imageRef = storage.reference().child(Constants.IMAGES_PATH).child(imageName) // QUOTE : THIS PART DOES NOT GIVE ANY FEEDBACK. NONE OF THE PRINTS INSIDE IT IS EXECUTED let uploadTask = imageRef.putData(imageData, metadata: nil) { (metadata, error) in if let error = error { // Uh-oh, an error occurred! print(error) return } imageRef.downloadURL { (url, error) in guard let downloadURL = url else { print ("error") return } urlString = downloadURL.absoluteString print("Downloaded image URL ", urlString) } } // UNQUOTE print ("after uploadTask", imageRef.downloadURL) // THE URL IS ALWAYS EMPTY "" return urlString }
I set a debugger breakpoint, which shows that the code inside the uploadTask is not executed, just the uploadTask is executed and everything inside is skipped.
The uploadImage function is called after picking the Image like this:
var image = uploadImage(imageView: imageView)
The image is picked here (this works fine):
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { imageView.contentMode = .scaleAspectFit imageView.image = pickedImage print("image chosen") } dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) }
I initialised like this, which should be ok:
import UIKit import os.log import FirebaseFirestore import Firebase class DisplayMediumViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var storage: Storage! override func viewDidLoad() { super.viewDidLoad() // Additional setup after loading the view. imagePicker.delegate = self // Create tap gesture recognizer let tapGesture = UITapGestureRecognizer(target: self, action: #selector(DisplayMediumViewController.imageTapped(gesture:))) // Aadd it to the image view; imageView.addGestureRecognizer(tapGesture) // Make sure imageView can be interacted with by user imageView.isUserInteractionEnabled = true }
I searched a lot in the internet and tried different ways to implement it, none was successful. It would be great, if someone has a hint why the "uploadTask = imageRef.putData" does not upload the image nor return any downloadURL.