Firebase Storage图片上传成功但无法获取下载URL(404错误)
问题原因分析
- 核心错误:你在获取下载URL时,调用的是根存储引用
ref(指向photo目录)的getDownloadUrl()方法,但实际上传的文件是在photo目录下的子路径postId+"-"+fmNumber中。Firebase Storage的目录本身不是文件,因此请求根目录的下载URL会返回404错误,提示对象不存在。
解决方法
有两种可靠的修复方式:
方式一:复用上传时的子存储引用
在上传成功的回调中,直接使用上传文件对应的子引用调用getDownloadUrl(),确保路径与上传路径完全一致:
ref.child(postId+"-"+fmNumber).putFile(result) .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // 复用上传时的子引用,而非根引用ref ref.child(postId+"-"+fmNumber).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { image = uri.toString(); System.out.println(image); Toast.makeText(FromActivity.this, "Image Upload Successful", Toast.LENGTH_SHORT).show(); uploadComplete = true; } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(FromActivity.this, "Failed to get download URL", Toast.LENGTH_SHORT).show(); } }); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(FromActivity.this, "Upload failed", Toast.LENGTH_SHORT).show(); } });
方式二:通过TaskSnapshot直接获取文件引用
UploadTask.TaskSnapshot对象提供了getStorage()方法,直接返回当前上传文件的存储引用,无需重新拼接路径:
ref.child(postId+"-"+fmNumber).putFile(result) .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // 从taskSnapshot获取上传文件的引用 taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { image = uri.toString(); System.out.println(image); Toast.makeText(FromActivity.this, "Image Upload Successful", Toast.LENGTH_SHORT).show(); uploadComplete = true; } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(FromActivity.this, "Failed to get download URL", Toast.LENGTH_SHORT).show(); } }); } });
额外建议
- 建议添加
addOnFailureListener监听上传和获取URL的失败情况,便于排查异常。 - 生成
postId时,考虑使用Firebase的push()方法生成唯一键,比随机数更可靠:String postId = ref.push().getKey();
内容的提问来源于stack exchange,提问作者RmTomal
相关产品推荐
相关产品推荐

