Flutter上传文件至Firebase Storage失败,求排查object-not-found错误
问题原因分析
你遇到的firebase_storage/object-not-found错误,核心原因是上传文件时没有指定具体的文件名:
你的代码中storage.ref().child('cartesPro/')指向的是Firebase Storage中的虚拟目录,而非具体的文件路径。Firebase Storage不允许直接向目录引用上传文件,必须指定明确的文件名,否则上传后无法生成有效的文件对象,后续调用getDownloadURL()时自然会找不到对应对象,返回404错误。
修复方案
修改uploadFile方法,为上传的文件指定唯一文件名(比如结合时间戳和原文件名生成,避免文件覆盖):
import 'dart:io'; class DatabaseMethods { CollectionReference cartesPro = FirebaseFirestore.instance.collection('cartesPro'); FirebaseStorage storage = FirebaseStorage.instance; Future<String> uploadFile(File file) async { // 生成唯一文件名,防止重复上传覆盖文件 String fileName = '${DateTime.now().millisecondsSinceEpoch}_${file.path.split('/').last}'; // 指定完整的文件存储路径:目录 + 文件名 Reference reference = storage.ref().child('cartesPro/$fileName'); print('REFERENCE: ${reference}'); UploadTask uploadTask = reference.putFile(file); TaskSnapshot taskSnapshot = await uploadTask; return await taskSnapshot.ref.getDownloadURL(); } void addFile(CartPro cartPro) { cartesPro.add({ "cartUserId": cartPro.cartUserId, "cartTimestamp": FieldValue.serverTimestamp() }); } }
额外检查项
- 文件有效性验证:确保传入的
file是存在的有效文件,可在上传前增加判断:if (!await file.exists()) { throw Exception('待上传文件不存在'); } - Storage权限规则检查:确认Firebase Storage的安全规则允许上传操作,测试阶段可临时设置为开放规则(上线前务必修改为严格权限):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if true; } } }
内容的提问来源于stack exchange,提问作者Fedy Belaid
相关产品推荐
相关产品推荐

