9

私のアプリ内にUIImagePickerがうまく動作するように設定しました。自分のUIImageピッカーが選択されたら、プロフィール画像をFirebaseにアップロードしたいと思います。ここでは、画像が選択されたときの私の機能があります。UIImage Pickerから新しいFirebase(Swift)に画像をアップロード

//image picker did finish code 
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    profilePic.contentMode = .ScaleAspectFill 
    profilePic.image = chosenImage 
    profilePic.hidden = false 
    buttonStack.hidden = true 
    changeButtonView.hidden = false 
    self.statusLabel.text = "Here is Your Profile Picture" 

    dismissViewControllerAnimated(true, completion: nil) 


} 

新しいドキュメントでは、ファイルをアップロードするためにNSUR1を宣言する必要があると記載されています。ここでは、指定されたファイルのNSURLを検索しようとしましたが、動作しません。ここではドキュメントとそれにリンクされます。ここではhttps://firebase.google.com/docs/storage/ios/upload-files#upload_from_data_in_memory

// File located on disk 
let localFile: NSURL = ... 
// Create a reference to the file you want to upload 
let riversRef = storageRef.child("images/rivers.jpg") 

// Upload the file to the path "images/rivers.jpg" 
let uploadTask = riversRef.putFile(localFile, metadata: nil) { metadata, error in 
    if (error != nil) { 
    // Uh-oh, an error occurred! 
    } else { 
    // Metadata contains file metadata such as size, content-type, and download URL. 
    let downloadURL = metadata!.downloadURL 
    } 
} 

はUIImagePickerのNSURLを取得するための私の試みです:

//image picker did finish code 
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

     let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
     //getting the object's url 
     let imageUrl = info[UIImagePickerControllerReferenceURL] as! NSURL 
     let imageName = imageUrl.lastPathComponent 
     let documentDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as String; 
     let photoUrl = NSURL(fileURLWithPath: documentDir) 
     let localPath = photoUrl.URLByAppendingPathComponent(imageName!) 
     self.localFile = localPath 

     profilePic.contentMode = .ScaleAspectFill 
     profilePic.image = chosenImage 
     profilePic.hidden = false 
     buttonStack.hidden = true 
     changeButtonView.hidden = false 
     self.statusLabel.text = "Here is Your Profile Picture" 

     dismissViewControllerAnimated(true, completion: nil) 


    } 

私がイメージだった場合、私はまた、困難に実行していますことを信じてそれはまだデバイスに保存されていないので、ギャラリーの代わりにカメラから取り込まれます。この画像/スナップショットのNSURLはどのようにして見つけられますか?私はfirebaseデータベースへの格納イメージURLをも

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 
    userPhoto.image = image 
    dismissViewControllerAnimated(true, completion: nil) 
    var data = NSData() 
    data = UIImageJPEGRepresentation(userPhoto.image!, 0.8)! 
    // set upload path 
    let filePath = "\(FIRAuth.auth()!.currentUser!.uid)/\("userPhoto")" 
    let metaData = FIRStorageMetadata() 
    metaData.contentType = "image/jpg" 
    self.storageRef.child(filePath).putData(data, metadata: metaData){(metaData,error) in 
     if let error = error { 
      print(error.localizedDescription) 
      return 
     }else{ 
     //store downloadURL 
     let downloadURL = metaData!.downloadURL()!.absoluteString 
     //store downloadURL at database 
    self.databaseRef.child("users").child(FIRAuth.auth()!.currentUser!.uid).updateChildValues(["userPhoto": downloadURL]) 
     } 

     } 
        } 

、ユーザーがプロフィール写真を持っているか、uがクラッシュする可能性がありますかどうかを確認:ここ

答えて

24

がfirebaseストレージからユーザーのプロフィール写真をアップロードし、ダウンロードするための私の方法であり、

//get photo back 

    databaseRef.child("users").child(userID!).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      // check if user has photo 
      if snapshot.hasChild("userPhoto"){ 
       // set image locatin 
       let filePath = "\(userID!)/\("userPhoto")" 
       // Assuming a < 10MB file, though you can change that 
       self.storageRef.child(filePath).dataWithMaxSize(10*1024*1024, completion: { (data, error) in 

        let userPhoto = UIImage(data: data!) 
        self.userPhoto.image = userPhoto 
       }) 
      } 
     }) 
+0

次のようなパスを作成することもできます。let path = "\(NSUUID()。uuidString)" – Neen

+0

@Neen素晴らしい提案!ありがとう。 –

+0

アップロードビットがうまく機能します。ダウンロードは私のためには機能しません。私は別にそれをやらなければならなかった。 –

関連する問題