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

JS上传图片至Firebase Storage后无法获取下载URL如何解决

问题原因

你的判断是对的,uploadBytesResumable 上传完成返回的快照对象本身不直接包含下载URL字段,URL需要单独调用接口获取。你拿不到URL是代码存在三处错误:

  • 定义了getData函数包裹取URL的逻辑,但从未调用该函数,内部代码完全不会执行
  • getDownloadURL是异步Promise操作,你在Promise回调外立刻打印ProPicUrl,此时URL还未完成赋值,打印结果必然是undefined
  • 模块化v9及以上版本的Firebase SDK中,getDownloadURL是独立导出的方法,需要传入存储引用调用,并非挂载在上传快照对象上的方法
修复方案

首先确保你已经从firebase/storage导入了getDownloadURL方法,之后调整上传回调的逻辑,去掉无效的函数定义,等异步返回URL后再执行后续的存库、渲染逻辑。
修复后的完整代码如下:

// 顶部导入依赖,如果你已经导入过其他方法,把getDownloadURL加进去即可
// import { getStorage, ref as sRef, uploadBytesResumable, getDownloadURL } from "firebase/storage";

Upload.addEventListener('click', (e) =>{
    let ImSRC = files[0];
    
    if(ImSRC == null ){
        alert('no picture selected');
        return;
    }

    const metdata = {
        contentType: ImSRC.type
    }
    const storeref = sRef(storage,"UsersProPic/" + cUserID);
    const uploadTask = uploadBytesResumable(storeref, ImSRC, metdata);

    uploadTask.then(async (snapshot)=>{
        console.log('上传完成快照:', snapshot);
        // 传入对应文件的存储引用获取下载URL
        const ProPicUrl = await getDownloadURL(storeref);
        console.log('获取到的图片访问URL:', ProPicUrl);
        // 所有需要用到ProPicUrl的逻辑(比如写入数据库、渲染页面)都要写在这里
    }).catch(err => {
        console.error('上传或获取URL失败:', err);
    });
});

如果需要实现上传进度条,可以给uploadTask绑定state_changed事件监听,进度监听逻辑不会影响后续URL获取。

内容的提问来源于stack exchange,提问作者Criss Houd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:31:12