2016-08-20 84 views
-2

我想在我的iOS应用程序中制作一个按钮,当用户点击它时,他/她得到两个选择:从相册中选择一张照片或从相机拍摄照片到Firebase数据库。将图片库或相机中的图片上传到Firebase存储(Swift)

为了使这成为可能,我必须遵循什么样的结构?将图片上传到Firebase数据库!

+0

firebase如何参与您的问题? – EBDOKUM

+0

@ EBDOKUM因为我想将所选或拍摄的图像保存到firebase中! – Mariah

+0

@ EBDOKUM你明白我的意思了吗? – Mariah

回答

4

确保你有你的第一个视图控制器在连接到导航控制器故事板

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 

    var imagePicker : UIImagePickerController = UIImagePickerController() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    imagePicker.delegate = self 
    } 



    //============================================================================================================================================================ 

////// 
// 
//PROFILE PICTURE FUNCTIONS 
// 
///// 




@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.present() 

     }else{ 
      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.present() 

     }else{ 

      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.addAction(cameraAction) 

    alertController.addAction(libraryAction) 

    alertController.addAction(cancelAction) 

    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.addAction(okAction) 
    alertController.popoverPresentationController?.sourceView = view 
    alertController.popoverPresentationController?.sourceRect = view.frame 

    return alertController 
    } 

} 

火力地堡功能: -

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

    if let referenceUrl = infoOnThePicture[UIImagePickerControllerReferenceURL] { 
     print(referenceUrl) 

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

     let asset = assets.firstObject 
     print(asset) 

     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!") 

         } 
          else{ 

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

           print(metadata?.downloadURL()) 

           print("The pic has been uploaded") 

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

           self.uploadSuccess(metadata!, storagePath: filePath) 

           completionBlock() 
        } 

      }) 
     }) 

    }else{ 

      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!") 

    print(storagePath) 

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

    NSUserDefaults.standardUserDefaults().synchronize() 

} 

PS: - 此回购环节可能在将来有用:) https://github.com/firebase/quickstart-ios(firebase官方样本)

+0

我试了第一部分,它工作!但是我不会尝试第二部分,直到我阅读了很多关于uiimagepickercontroller的内容,并且看到https://github.com/firebase/quickstart-ios示例不只是复制和修改代码!谢谢! – Mariah

+0

避免在评论中提出问题。发布一个新的... – Dravidian

相关问题