
本文详解 Firebase Storage 中因引用对象不一致导致的 404 错误(StorageException: Object does not exist at location),通过修正 StorageReference 复用逻辑,确保上传与下载使用同一路径引用。
本文详解 firebase storage 中因引用对象不一致导致的 404 错误(storageexception: object does not exist at location),通过修正 `storagereference` 复用逻辑,确保上传与下载使用同一路径引用。
在使用 Firebase Storage 上传图片并获取下载 URL 时,常见错误 StorageException: Object does not exist at location. Code: -13010 HttpResult: 404 并非网络或权限问题,而是逻辑性引用错位所致:你向一个子路径(如 "photo/123456-789")上传了文件,却试图从父路径(如 "photo")直接调用 getDownloadUrl() —— 后者并无实际存储对象,自然返回 404。
✅ 正确做法:复用同一 StorageReference 实例
关键原则是:上传和获取下载 URL 必须基于完全相同的 StorageReference 对象。你不能先用 ref.child(...) 上传,再用原始 ref 去取 URL;而应提前创建并复用该子引用:
// ✅ 正确:定义明确、可复用的文件引用
String fileName = postId + "-" + fmNumber;
StorageReference fileRef = ref.child(fileName); // ← 统一引用点
fileRef.putFile(result)
.addOnSuccessListener(taskSnapshot -> {
// ✅ 使用同一个 fileRef 获取下载 URL
fileRef.getDownloadUrl().addOnSuccessListener(uri -> {
image = uri.toString();
System.out.println("Download URL: " + image);
Toast.makeText(FromActivity.this, "Image Upload Successful", Toast.LENGTH_SHORT).show();
uploadComplete = true;
}).addOnFailureListener(e -> {
// ⚠️ 注意:getDownloadUrl() 也可能失败(如权限不足或文件未完成上传)
Log.e("FirebaseStorage", "Failed to get download URL", e);
Toast.makeText(FromActivity.this, "Failed to retrieve image URL", Toast.LENGTH_LONG).show();
});
})
.addOnFailureListener(e -> {
Log.e("FirebaseStorage", "Upload failed", e);
Toast.makeText(FromActivity.this, "Upload failed: " + e.getMessage(), Toast.LENGTH_LONG).show();
});? 补充说明与最佳实践
- getDownloadUrl() 是异步且非幂等操作:它依赖服务端元数据就绪,建议始终添加 addOnFailureListener 捕获如 FirebaseStorageException(如 UNAUTHORIZED, NOT_FOUND);
- 避免硬编码路径拼接:使用 child() 链式调用更安全,例如 ref.child("images").child("user").child(userId).child(timestamp + ".jpg");
-
推荐升级至 Task<Uri> API(现代写法):
fileRef.getDownloadUrl().continueWith(task -> { if (!task.isSuccessful()) { throw task.getException(); } return task.getResult().toString(); }).addOnCompleteListener(task -> { if (task.isSuccessful()) { image = task.getResult(); } }); -
权限检查:确认 Firebase Storage Security Rules 允许读取对应路径,例如:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /photo/{id} { allow read: if true; // 或更严格的 auth 条件 allow write: if request.auth != null; } } }
✅ 总结
该 404 错误本质是「引用不匹配」,而非服务异常。只需将动态生成的子路径封装为独立 StorageReference 变量,并在上传与 URL 获取中严格复用,即可彻底解决。同时务必添加完整的错误处理与权限验证,构建健壮的图片上传流程。

















