Mariah Mariah - 1 year ago 302
Swift Question

Uploading an image from Photo Library or Camera to Firebase storage (Swift)

I want to make a button in my iOS application, when the user clicks on it, he/she gets two options: either choose a photo from the Album or take a photo from the camera to the firebase database.

What's the structure I have to follow to make this possible? Uploading the image to the firebase database!

Answer Source

Make sure you have your first view controller in storyboard connected to a navigation Controller

 class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

  var imagePicker : UIImagePickerController = UIImagePickerController()

  override func viewDidLoad() {

    imagePicker.delegate = self



@IBAction func addPictureBtnAction(sender: UIButton) {

    addPictureBtn.enabled = false

    let alertController : UIAlertController = UIAlertController(title: "Title", message: "Select Camera or Photo Library", preferredStyle: .ActionSheet)
    let cameraAction : UIAlertAction = UIAlertAction(title: "Camera", style: .Default, handler: {(cameraAction) in
        print("camera Selected...")

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) == true {

            self.imagePicker.sourceType = .Camera

            self.presentViewController(self.showAlert("Title", Message: "Camera is not available on this Device or accesibility has been revoked!"), animated: true, completion: nil)



    let libraryAction : UIAlertAction = UIAlertAction(title: "Photo Library", style: .Default, handler: {(libraryAction) in

        print("Photo library selected....")

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) == true {

            self.imagePicker.sourceType = .PhotoLibrary


           self.presentViewController(self.showAlert("Title", Message: "Photo Library is not available on this Device or accesibility has been revoked!"), animated: true, completion: nil)

    let cancelAction : UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel , handler: {(cancelActn) in
    print("Cancel action was pressed")




    alertController.popoverPresentationController?.sourceView = view
    alertController.popoverPresentationController?.sourceRect = view.frame

    self.presentViewController(alertController, animated: true, completion: nil)


func present(){

        self.presentViewController(imagePicker, animated: true, completion: nil)


func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
     print("info of the pic reached :\(info) ")
     self.imagePicker.dismissViewControllerAnimated(true, completion: nil)


//Show Alert

func showAlert(Title : String!, Message : String!)  -> UIAlertController {

    let alertController : UIAlertController = UIAlertController(title: Title, message: Message, preferredStyle: .Alert)
    let okAction : UIAlertAction = UIAlertAction(title: "Ok", style: .Default) { (alert) in
        print("User pressed ok function")


    alertController.popoverPresentationController?.sourceView = view
    alertController.popoverPresentationController?.sourceRect = view.frame

    return alertController


Firebase Functions :-

func profilePictureUploading(infoOnThePicture : [String : AnyObject],completionBlock : (()->Void)) {

    if let referenceUrl = infoOnThePicture[UIImagePickerControllerReferenceURL] {

        let assets = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl as! NSURL], options: nil)

        let asset = assets.firstObject

        asset?.requestContentEditingInputWithOptions(nil, completionHandler: { (ContentEditingInput, infoOfThePicture)  in

            let imageFile = ContentEditingInput?.fullSizeImageURL
            print("imagefile : \(imageFile)")

            let filePath = FIRAuth.auth()!.currentUser!.uid +  "/\(Int(NSDate.timeIntervalSinceReferenceDate() * 1000))/\(imageFile!.lastPathComponent!)"

            print("filePath : \(filePath)")

                FIRControllerClass.storageRef.child("ProfilePictures").child(filePath).putFile(imageFile!, metadata: nil, completion: {

                    (metadata, error) in

                         if error != nil{

                            print("error in uploading image : \(error)")

                            self.delegate.firShowAlert("Error Uploading Your Profile Pic", Message: "Please check your network!")


                                print("metadata in : \(metadata!)")


                                print("The pic has been uploaded")

                                print("download url : \(metadata?.downloadURL())")

                                self.uploadSuccess(metadata!, storagePath: filePath)




            print("No reference URL found!")


//Saving the path in your core data to search through later when you retrieve your picture from DB

func uploadSuccess(metadata : FIRStorageMetadata , storagePath : String)

    print("upload succeded!")


    NSUserDefaults.standardUserDefaults().setObject(storagePath, forKey: "storagePath.\((FIRAuth.auth()?.currentUser?.uid)!)")



ps: - This repo link might be useful in future :) (firebase official sample's)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download