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

Firebase视频上传报错:storage/object-not-found 对象不存在问题

问题分析与解决方案

错误根源

你遇到的storage/object-not-found错误,核心原因是错误判断了上传完成的时机:通过progress === 100触发后续操作时,Firebase Storage可能还未完成文件的最终写入、索引等后台流程,此时文件对象尚未真正可用,调用getDownloadURL自然会提示找不到对象。

另外,原代码中upload函数没有等待上传任务完成就结束,handleUpload里的await upload(videoFile)并未实际等待上传完成,进一步加剧了时序问题。

修正方案

1. 正确监听上传完成事件

放弃通过进度值判断完成状态,改用uploadBytesResumable提供的成功回调来触发后续操作,确保文件完全上传完成后再获取下载URL。

2. 让upload函数返回上传完成的Promise

改造upload函数,使其返回Promise,确保handleUpload能等待上传完成后再执行后续逻辑。

修正后的完整代码

async function handleUpload() {
  if (videoFile) {
    try {
      const storageRef = await upload(videoFile);
      await handleUploadSuccess(storageRef);
    } catch (error) {
      console.error("上传失败:", error);
    }
  } else {
    alert("请先选择一个视频。");
  }
}

async function upload(uri) {
  const response = await fetch(uri);
  const blob = await response.blob();

  const storageRef = ref(storage, "Sermon/" + new Date().getTime());
  const uploadTask = uploadBytesResumable(storageRef, blob);

  return new Promise((resolve, reject) => {
    uploadTask.on("state_changed", 
      (snapshot) => {
        // 处理上传进度
        const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
        console.log(`上传进度: ${progress}%`);

        if (snapshot.state === "paused") {
          console.log("上传已暂停");
        } else if (snapshot.state === "running") {
          console.log("上传中");
        }
      },
      // 上传失败回调
      (error) => {
        reject(error);
      },
      // 上传完成回调
      () => {
        console.log("上传完成");
        resolve(uploadTask.snapshot.ref);
      }
    );
  });
}

async function handleUploadSuccess(storageRef) {
  try {
    const downloadUrl = await getDownloadURL(storageRef);
    const createdAt = new Date().getTime();
    await saveRecord(
      downloadUrl,
      title,
      preacher,
      series,
      createdAt
    );
    setVideoFile("");
  } catch (error) {
    console.error("获取下载URL失败:", error);
  }
}

async function saveRecord(url, title, preacher, series, createdAt) {
  try {
    const docRef = await addDoc(collection(db, "sermon"), {
      url,
      title,
      preacher,
      series,
      createdAt,
      isFeatured: '0'
    });
    console.log("记录已保存,ID:", docRef.id);
  } catch (e) {
    console.log("保存记录失败:", e);
  }
}

额外检查项

  • 确认Firebase Storage规则允许上传和读取操作(测试阶段可临时使用宽松规则,生产环境需严格限制):
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

内容的提问来源于stack exchange,提问作者lyon98.dbios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:42:50