Firebase Storage多图上传报-13010 404错误 存储端可见图片端侧报错
问题原因
核心问题是异步场景下的变量覆盖:
- 你代码中使用的
storageReference是方法外部的全局/成员变量,for循环每一轮遍历都会覆盖这个变量的值 - Firebase上传操作是异步的,上传成功的
onSuccess回调不会立刻执行,等回调触发时,storageReference已经被后续循环修改为其他文件的存储路径 - 此时你用被覆盖的
storageReference调用getDownloadUrl(),对应的路径要么还没上传完成,要么和本次上传成功的文件不匹配,就会抛出404不存在的错误。由于上传逻辑本身没有问题,所以你可以在Firebase控制台看到所有文件都上传成功。
解决方法
不要在上传成功回调中使用外部的storageReference变量,直接从taskSnapshot中获取本次上传文件对应的存储引用即可,修改后的核心代码如下:
storageReference.putFile(fileUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // 直接从taskSnapshot获取当前上传文件的存储引用,避免变量覆盖问题 taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(@NonNull Uri uri) { Log.d(TAG, "Image Uploaded "); Log.d(TAG, "onSuccess: URI Uploaded == "+uri); } }); } }) // 其余进度监听、失败监听逻辑保持不变即可
也可以选择把storageReference定义为for循环内部的局部变量,让每轮循环的引用独立、不会被后续循环覆盖,也可以解决问题。
内容的提问来源于stack exchange,提问作者androidXP
相关产品推荐
相关产品推荐

