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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:50:17