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
相关产品推荐
相关产品推荐

