2017-05-28 135 views
0

我的應用程序允許進行Facebook身份驗證。當用戶登錄時,我想建立一個名爲用戶的節點,其中包含用戶的一些信息。具體而言,我希望從Facebook獲取用戶的UID,姓名和個人資料圖片。從firebase存儲檢索圖像url到數據庫

這是到目前爲止我的代碼:

let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 

    // using the credentials above, sign in to firebase to create a user session 
    FIRAuth.auth()?.signIn(with: credential) { (user, error) in 
     print("User logged in the firebase") 

     // adding a reference to our firebase database 
     let ref = FIRDatabase.database().reference(fromURL: "https://gsignme-14416.firebaseio.com/") 

     // guard for user id 
     guard let uid = user?.uid else { 
      return 
     } 

     // create a child reference - uid will let us wrap each users data in a unique user id for later reference 
     let usersReference = ref.child("users").child(uid) 

     // performing the Facebook graph request to get the user data that just logged in so we can assign this stuff to our Firebase database: 


     let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil).start{ 
      (connection, result, err) in 


      if let user = FIRAuth.auth()?.currentUser{ 
       let name = user.displayName! as String 


       let newImage = UIGraphicsGetImageFromCurrentImageContext() 
       let data: Data = UIImageJPEGRepresentation(newImage!, 0.5)! 
       let storage = FIRStorage.storage() 
       let storageRef = storage.reference(forURL: "gs://gsignme-14416.appspot.com") 
       let profilePicRef = storageRef.child(user.uid+"/profile_pic.jpg") 


       let metadata = FIRStorageMetadata() 
       metadata.contentType = "image/jpg" 

       // Upload the file 
       let uploadTask = profilePicRef.put(data, metadata: metadata) { metadata, error in 
        if (error == nil) { 

         self.downloadurl = metadata!.downloadURL()!.absoluteString 

        } else { 

         print("there was an error uploading the profile pic!") 


        } 


       let postObject: Dictionary<String, Any> = [ 
        "uid": uid, 
        "username" : name, 
        "userpic" : self.downloadurl 


       ] 



      if ((error) != nil) { 
       // Process error 
       print("Error: \(String(describing: error))") 
      } else { 
       print("fetched user: \(String(describing: result))") 

       let values: [String:AnyObject] = result as! [String : AnyObject] 

       // update our database by using the child database reference above called usersReference 
       usersReference.updateChildValues(postObject, withCompletionBlock: { (err, ref) in 
        // if there's an error in saving to our firebase database 
        if err != nil { 
         print(err!) 
         return 
        } 
        // no error, so it means we've saved the user into our firebase database successfully 
        print("Save the user successfully into Firebase database") 
       }) 
      } 
       }}} 


    } 

沒有實現從火力存儲檢索用戶的照片URL,它完美的作品通過輸出的名稱和UID。但是,當我嘗試從Firebase存儲中檢索圖像URL時,它會崩潰並且無法輸出。我不確定我做錯了什麼。

我希望數據庫是這樣的: enter image description here

回答

0

下面是如何在DB圖像的存儲和更新的鏈接上傳圖片,然後如何從鏈接獲取圖像的過程。

更新數據庫中的數據。

//// **NOTE:** store user ID globally in user auth so that you use userID here 
func updateUserData(){ 
     let dbstrPath : String! = "\(userid)"// where you wanted to store Db. 

     // Create dict as your DB. 
     let aDictUpdateValues = ["userName"  : "John", 
           "userEmail"  : "[email protected]", 
           "userPic"  : "", 
           "uid"   : userid] 
     // The Db is created as per your dict and file path. So create this two things specifically according to you.. 
     dbRef!.child(dbstrPath).updateChildValues(aDictUpdateValues, withCompletionBlock: { (error, ref) in 

      if error == nil{ 
       print("updated successfully") 
       self.uploadProfilePic() 
       dbRef.child(dbstrPath).setValue(aDictUpdateValues) 

       let aData = NSKeyedArchiver.archivedData(withRootObject: auserDetail) 
       print(ref) 
      } 
      else{ 
       print("error in updation") 
       print(error!) 
      } 
     }) 
    } 

//上傳存儲圖像

func uploadProfilePic(){ 
     var data = NSData() 
     data = UIImageJPEGRepresentation(ivProfile.image!, 0.8)! as NSData 
     // set upload path 
     let filePath = "\(userid)" // path where you wanted to store img in storage 
     let metaData = FIRStorageMetadata() 
     metaData.contentType = "image/jpg" 

     self.storageRef = FIRStorage.storage().reference() 
     self.storageRef.child(filePath).put(data as Data, metadata: metaData){(metaData,error) in 
      if let error = error { 
       print(error.localizedDescription) 
       return 
      }else{// store imageURL in DB. 
       let dbfilePath = "\(userid)/userpic" // update db userpic link. 
       //store downloadURL 
       let downloadURL = metaData!.downloadURL()!.absoluteString 
       //store downloadURL at database 
       dbRef.child(dbfilePath).updateChildValues(["userPic" : downloadURL]) 
      } 
     } 

    } 

獲取圖像的形式存儲火力點。

func getProfileImage(){ 
      let dbstrPath : String! = "your_db_path" // path where link is stored in DB. 
     dbRef.child(dbstrPath).observeSingleEvent(of: .value, with: { (snapshot) in 

      // get dict of value from db. 
      if let aDictValue = snapshot.value! as? [String : Any] { 

       // call storage ref from link 
       self.storageRef = FIRStorage.storage().reference(forURL: aDictValue[Constant.FireBaseDBKey.kuserProfilePic]! as! String) 
       // Assuming your image size < 10MB. 
       self.storageRef.data(withMaxSize: 10*1024*1024, completion: { (data, error) in 
        if data != nil{ // if image found 
         let userPhoto = UIImage(data: data!) 
         self.ivProfile.image = userPhoto 
        } 
        else{ // if img not found set default image. 
         self.ivProfile.image = UIImage(named: "profile") 
        } 
       }) 
      } 
     }) 
    }