在Firebase上保存与用户关联的个人资料照片

时间:2017-10-31 09:01:48

标签: ios image firebase photo firebase-storage

我正在使用Firebase for iOS 在我的应用中,用户必须将照片与其个人资料相关联 在MySQL上有BLOB类型来保存数据库中的图像 但是在Firebase上我找不到这样的东西

3 个答案:

答案 0 :(得分:1)

您必须使用Firebase Storage上传图片,然后获取网址并将网址保存在数据库中的某个位置。

以下是有关如何上传文件的文档:https://firebase.google.com/docs/storage/ios/upload-files

以下是我的一个项目的例子

FIRStorageReference *ref = [[[FIRStorage storage] reference] child:[NSString stringWithFormat:@"images/users/profilesPictures/pp%@.jpg", [UsersDatabase currentUserID]]];
[ref putData:imageData metadata:nil completion:^(FIRStorageMetadata * _Nullable metadata, NSError * _Nullable error) {
    if (error) {
        [[self viewController] hideFullscreenLoading];
        [[self viewController] showError:error];
    } else {
        [ref downloadURLWithCompletion:^(NSURL * _Nullable URL, NSError * _Nullable error) {
            if (error) {
                [[self viewController] hideFullscreenLoading];
                [[self viewController] showError:error];
            } else {
                [[self viewController] hideFullscreenLoading];
                [self.profilePictureButton setImage:nil forState:UIControlStateNormal];
                [[UsersDatabase sharedInstance].currentUser setProfilePictureURL:[URL absoluteString]];
                [UsersDatabase saveCurrentUser]; // This also updates the user's data in the realtime database.
            }
        }];
    }
}];

答案 1 :(得分:1)

guard let uid = Auth.auth().currentUser?.uid else {return}
guard let imageData = UIImageJPEGRepresentation(profilePic, 0.5) else {return}
        let profileImgReference = Storage.storage().reference().child("profile_image_urls").child("\(uid).png")
        let uploadTask = profileImgReference.putData(imageData, metadata: nil) { (metadata, error) in
            if let error = error {
                print(error.localizedDescription)
            } else {
                let downloadURL = metadata?.downloadURL()?.absoluteString ?? ""
                // Here you get the download url of the profile picture.
            }
        }
        uploadTask.observe(.progress, handler: { (snapshot) in
            print(snapshot.progress?.fractionCompleted ?? "")
            // Here you can get the progress of the upload process.
        })

第1步:使用UIImageJPEGRepresentation(UIImage, compressionQuality)UIImagePNGRepresentation(UIImage)

将您的UIImage转换为Jpeg数据或PNG数据

第2步:创建存储引用。在上面的示例中,我使用Storage.storage().reference()获取当前Firebase应用的存储引用,然后使用.child("FolderName")

创建文件夹

第3步:使用Firebase存储的.putData功能将图像数据上传到Firebase存储。您可以捕获任务引用(即uploadTask)以观察上载的进度。

//注意:我使用Firebase用户ID作为图片名称,因为每个用户ID对于firebase Auth都是唯一的,并且在配置文件图片替换或意外删除时没有不匹配。

答案 2 :(得分:1)

幸运的是,这是一项非常简单的任务。

Firebase用户对象具有photoUrl属性,可以像这样读取

let user = Auth.auth().currentUser
if let user = user {
  let uid = user.uid
  let email = user.email
  let photoURL = user.photoURL
  // ...
}

网址可以是Firebase外部的网址,也可以保存在Firebase storage

更改photoUrl:

let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.displayName = //if you want to change the displayName
changeRequest?.photoURL = //some Url
changeRequest?.commitChanges { (error) in
  // ...
}