You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Storage删除图片后App仍显示图片的原因咨询

Firebase Storage删除图片后App仍显示图片但浏览器返回404的原因解析

问题描述

我正在学习使用Firebase,开发了首个实现图片存储与检索的应用,通过存储图片及对应的URL实现功能,原本运行正常。今日测试发现,在Firebase Storage中删除所有内容后,我的App仍能通过链接获取并显示图片,但浏览器打开相同链接会返回如下404错误:

{
  "error": {
    "code": 404,
    "message": "Not Found."
  }
}

补充说明:我尝试清除Android Studio缓存后,图片不再显示,推测是Android Studio缓存导致,但不清楚具体原因。

相关代码

StorageReference dbStorageRef = FirebaseStorage.getInstance(URL_storage).getReference("images/" + element_name_add.getText());
dbStorageRef.putFile(image_to_up).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        dbStorageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                System.out.println("Element created and uploaded with success");
                dataSnapshot.getRef().child(element_name_add.getText().toString()).child("type").setValue(item_type);
                dataSnapshot.getRef().child(element_name_add.getText().toString()).child("time").setValue(item_time);
                dataSnapshot.getRef().child(element_name_add.getText().toString()).child("description").setValue(element_desc_add.getText().toString());
                dataSnapshot.getRef().child(element_name_add.getText().toString()).child("image_url").setValue(uri.toString());
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                System.out.println("ERROR: element not created");
            }
        });
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        System.out.println("ERROR");
    }
});

原因解析

  • Firebase Storage Android SDK的自动缓存:Firebase Storage的Android SDK默认会对已下载的文件做本地缓存,目的是提升App加载速度、减少网络请求。当你在云端删除图片后,App并没有立即清理本地缓存的副本,所以依然能通过之前的URL读取本地缓存的图片文件;而浏览器没有缓存该图片(或缓存已失效),直接请求云端资源就会返回404。
  • Android Studio缓存清理的本质:你清除Android Studio缓存时,实际是清理了测试设备/模拟器上App的缓存目录,本地存储的图片缓存被删除,此时App再请求该URL就会去访问云端,而云端资源已经不存在,所以图片不再显示。
  • URL与云端资源的关系:通过getDownloadUrl()获取的URL本身是有效的访问凭证,但当对应的云端文件被删除后,这个URL就会失效。你App中存储在实时数据库的image_url并没有被删除,所以App依然会尝试加载该URL,只是一开始读取的是本地缓存。

额外建议

如果希望App能及时感知云端文件的删除,可以考虑:

  • 当删除云端文件时,同步删除实时数据库中对应的image_url记录;
  • 在加载图片时,增加错误监听,当请求云端返回404时,清理本地缓存并更新UI;
  • 手动控制Firebase Storage的缓存行为,比如调用setCacheControl()设置缓存策略,或者删除云端文件时同步清理本地缓存。

内容的提问来源于stack exchange,提问作者C-Gian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:40:46