2016-08-20 82 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

相關問題