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

如何用JavaScript正确上传图片到Firebase Storage?上传异常排查

问题分析与解决方案

问题根源

你错误地使用了window.URL.createObjectURL()的返回值作为上传内容——这个方法返回的是指向文件的URL字符串,而非实际的File/Blob对象。上传这个字符串自然只会生成9B左右的文件,且因为没有文件流数据,进度计算失效导致NaN%。

修复后的代码

直接使用picker.files[0]这个原生File对象进行上传,同时添加获取下载链接的逻辑:

const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
const storage = getStorage();

const picker = document.getElementById('img');

picker.onchange = function() {
  // 直接获取选中的File对象
  const file = picker.files[0];
  if (!file) return; // 空值判断,避免无文件时出错
  const filename = file.name;
  const storageRef = ref(storage, 'icons/' + filename);

  // 上传实际的File对象
  uploadBytes(storageRef, file)
    .then((snapshot) => {
      console.log('文件上传完成!');
      // 获取下载链接
      return getDownloadURL(snapshot.ref);
    })
    .then((downloadURL) => {
      console.log('文件下载链接:', downloadURL);
      // 这里可以把downloadURL赋值给页面元素或者存储起来
    })
    .catch((error) => {
      console.error('上传出错:', error);
    });
}

额外优化建议

  • 添加文件类型校验,确保只上传图片:
    if (!file.type.startsWith('image/')) {
      alert('请选择图片文件!');
      return;
    }
    
  • 添加上传进度监听(可选):
    uploadBytes(storageRef, file, {
      onProgress: (snapshot) => {
        const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
        console.log(`上传进度:${progress.toFixed(2)}%`);
      }
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:40:16