当前位置: 首页 > 知识库问答 >
问题:

将一个用户的图像上载到firebase存储时,数据库中每个用户的图像链接都会更新

桂志诚
2023-03-14

我正在使用Firebase Realtime Database和Firebase Storage在Android Studio中创建此应用程序。当用户通过我的应用注册时,数据将存储在 Firebase 实时数据库中。然后在个人资料页面上,有一个地方可以上传图片。当用户上传图片时,它将存储在firebase存储中,并且链接将在数据库中相应用户下的新字段上更新。

它在我上次检查时工作正常。但是,当我添加一个新用户并上传他的个人资料图片时,该链接也会在所有其他用户上更新。但是在Firebase存储中,没有任何变化。它只发生在Firebase实时数据库中。我找不到任何解决方案。

这是第一部分更新配置文件的链接。

  

      private void UploadProfPic(Uri image_uri) {
    
            final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
            strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
                    strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            Picasso.get().load(uri).fit().into(profPic);
    
    
                            imgRef = uri.toString();
    
    
                            usrRF.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot snapshot) {
                                    for(DataSnapshot dss : snapshot.getChildren()){
                                        String key = dss.getKey();
    
                                        Map<String, Object> updates = new HashMap<String, Object>();
                                        updates.put("profile_url", imgRef);
                                        usrRF.child(key).updateChildren(updates);
    
                                    }
                                }
    
                                @Override
                                public void onCancelled(@NonNull DatabaseError error) {
    
                                    Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
                                }
                            });
    
                        }
                    });
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
                    Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
                }
            });
        }

这里usrRf=FirebaseDatabase.getInstance(). get引用("用户");

这是我的数据库结构

任何帮助都将不胜感激。谢谢你。

共有1个答案

闻枫
2023-03-14

根据你最后的评论:

是的,Firebase电子邮件身份验证

然后,您应该考虑将用户数据保存在来自身份验证过程的UID下,而不是推送ID下,正如我现在在截图中看到的那样。这意味着您应该使用以下方法将用户对象添加到数据库:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
usersRef.child(uid).setValue(userObj).addOnCompleteListener(/* ... /*);

并且不使用:

usersRef.push().setValue(userObj).addOnCompleteListener(/* ... /*);

也就是说,为了能够更新上传到登录用户节点的图像,请使用以下更新方法:

final StorageReference strRef = storageReference.child("users/"+ email_i +"/profile.jpg");
strRef.putFile(image_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        Toast.makeText(getApplicationContext(), "Image has been uploaded", Toast.LENGTH_LONG).show();
        strRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                Picasso.get().load(uri).fit().into(profPic);
                imgRef = uri.toString();

                String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                DatabaseReference usersRef = rootRef.child("users");
                Map<String, Object> updates = new HashMap<String, Object>();
                updates.put("profile_url", imgRef);
                usersRef.child(uid).updateChildren(updates).addOnSuccessListener(/* ... /*);
            }
        });
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull /*@org.jetbrains.annotations.NotNull*/ Exception e) {
        Toast.makeText(getApplicationContext(), "Failed to update profile picture", Toast.LENGTH_LONG).show();
    }
});

看,没有for循环被包含?这给您带来了麻烦,因为它正在更新“用户”节点下的所有子节点。

 类似资料:
  • 我想在firebase存储中上载图像。我知道如何使用Uri在firebase中上传图像。但是有没有一种方法可以让我使用链接将图像上传到firebase? 我在我的项目中使用了一个API,我每月只能点击1000次,所以我试图在firebase中保存从API获取的图像。API提供了一个指向图像的链接,我使用它在Picasso的imageview中显示图像。 假设我的链接是http://xxx.xx.x

  • 问题内容: 我想将图像的下载URL放入Firebase数据库中。我可以将图像上传到存储中,但无法弄清楚如何将URL与其余的“帖子”一起放入数据库。 问题答案: 像这样组织您和func: 接下来,只需连接并保存到您的节点即可。 您也可以查看我有关上传数据并将URL保存到数据库的答案 希望能帮助到你

  • 我正在尝试上传图像到firebase,以及其他字符串和双数据类型。 我现在正在考虑两个选项,一个是上载imageUrl到firebase实时数据库,当我检索它时,我将检索一个imageUrl并将其转换为图像。 谢谢你的帮助!我很感激。

  • 我是新来的Firebase存储。只是为了让我可以学习它,我试图上传图像从ImageView到Firebase存储。我的应用程序有一个按钮。当我点击按钮时,图像(从可绘制的)会显示在图像视图上,同时,图像应该在点击按钮后上传到Firebase存储。到目前为止,我已经在点击按钮时显示了图像,但是我无法将其上传到Firebase存储中。addOnFilureListener被调用(我正在检查哪一个是通过

  • 我正在寻找一种安全的方式来存储用户的敏感媒体像驾照图片。据我所知,没有办法从Firebase存储规则访问Firebase实时数据库,以查看用户是否被授权查看媒体。如果我错了就纠正我。文档中有一些允许某些用户访问介质的方法,但这对我来说并不可行,因为可能有多个用户将访问介质,并且他们的权限状态可能在将来更改。 null

  • 我有一个按钮,它向用户提供选择,他是否想要从画廊或相机的图像。当用户从图库拍摄图像时,我能够成功地将图像上传到Firebase存储,但是当用户选择相机时,我无法将图像上传到存储。这是用户选择相机时的onActivityResult代码 它将图像上传到我的imageview,但给我错误提示 当我尝试上载到存储时 我在stack overflow上遇到了一个类似的问题。 我认为公认的答案是错误的,因为