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
相关产品推荐
相关产品推荐

