android 如何从Firebase存储中删除图片

cnwbcb6i  于 2023-03-21  发布在  Android
关注(0)|答案(3)|浏览(133)

我有一个应用程序,有许多用户,他们都存储在实时数据库中。我试图删除用户的按钮点击所有数据,但个人资料图片仍然留在Firebase存储删除后。所以当我试图删除图片从Firebase存储以及用户我得到这个错误。用户没有权限访问这个对象。
因此,我尝试删除ValueEventListener方法中的图片,因为我可以很容易地从实时数据库中获取ImageURL。
实时数据库
在数据库中,我有属性profileimage:GeneratedPictureUrlWhenUploadingToStorage此外,我在Firebase存储中的图片命名为currentUserId +“.JPG”,因此它就像一个标识符
储存规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

代码:

switch (view.getId()){
        case R.id.buttonEditProfile:
            startActivity(new Intent(this, ProfileEditActivity.class));
            break;
        case R.id.buttonUserList:
            startActivity(new Intent(this, UserListActivity.class));
            break;
        case R.id.buttonDeleteAccount:

            profileUserRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()){
                        StorageReference storageReference1;
                        String myImage = dataSnapshot.child("profileimage").getValue().toString();
                        storageReference1 = FirebaseStorage.getInstance().getReferenceFromUrl(myImage);
                        storageReference1.delete();
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

            DatabaseReference drFailure = FirebaseDatabase.getInstance().getReference("failures").child(currentUserId);
            DatabaseReference drVehicles = FirebaseDatabase.getInstance().getReference("vehicles").child(currentUserId);
            DatabaseReference drUsers = FirebaseDatabase.getInstance().getReference("users").child(currentUserId);
            FirebaseUser userDel = FirebaseAuth.getInstance().getCurrentUser();

            drFailure.removeValue();
            drVehicles.removeValue();
            drUsers.removeValue();
            userDel.delete();

当我按下按钮删除帐户时,我想删除唯一用户的存储图片

mklgxw1f

mklgxw1f1#

如果您收到权限错误,可能是存储规则阻止了您的访问。
还可以尝试使用文件名逻辑删除文件。例如:

StorageReference storageRef = storage.getReference();
StorageReference photoRef = storageRef.child("YOUR_PATH" + userId + ".jpg");

photoRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        // Success
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
       // Error
    }
});
8aqjt8rx

8aqjt8rx2#

如果您没有来自以下位置的firebase代码,您也可以更改规则:

service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if
request.auth != null;
}
}
}

收件人:

service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write;
}
}
}

从firebase获取代码后,请确保将其更改回来

yqlxgs2m

yqlxgs2m3#

//我做了同样的事情,但它在从firebase检索数据方面工作得很认真
检索用户信息();
用户引用=防火墙数据库.获取示例().获取引用(“用户”).子项(当前用户ID);私有空检索用户信息(){字符串当前用户ID = FirebaseAuth.getInstance().getCurrentUser().getUid();用户引用=防火墙数据库.获取示例().获取引用(“用户”).子项(当前用户ID);用户参考保持同步(真);userRef.addListenerForSingleValueEvent(新值事件监听器(){ @覆盖数据更改时的公共空值(@非空数据快照快照){ if((snapshot.exists())&&(snapshot.hasChild(“image”))){存储参考存储参考1;

String retrieveProfileImage = snapshot.child("image").getValue().toString();
                String retrieveUserName = snapshot.child("name").getValue().toString();

                storageReference1 = FirebaseStorage.getInstance().getReferenceFromUrl(retrieveProfileImage);
                storageReference1.delete();
                Toast.makeText(ImageActivity.this, "Welcome!", Toast.LENGTH_SHORT).show();

                Picasso.get().load(retrieveProfileImage).placeholder(R.drawable.pro_pic).into(imageView);
                textView.setText(retrieveUserName);

            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

}

相关问题