Flutter Firebase Storage上传报object-not-found错误排查
问题背景
Flutter项目接入Firebase Storage实现文件上传功能,使用的依赖版本如下:
- firebase_storage: ^10.3.1
- firebase_core: ^1.19.1
初始实现的文件上传代码:
Future<String> uploadFile(File _image) async { int uploadTimestamp = DateTime.now().millisecondsSinceEpoch; Reference ref = FirebaseStorage.instance.ref().child('posts/$uploadTimestamp'); UploadTask uploadTask = ref.putFile(_image); final TaskSnapshot taskSnapshot = await uploadTask.whenComplete(() {}); final url = await taskSnapshot.ref.getDownloadURL(); return url; }
执行上传操作时抛出错误:
[firebase_storage/object-not-found] No object exists at the desired reference.
错误提示:目标引用路径下不存在对应存储对象,无法正常获取文件的下载访问地址。
故障原因
核心问题出在对UploadTask的等待逻辑上:
whenComplete方法仅会在上传任务的Future触发完成回调时执行后续逻辑,不会校验上传任务的实际执行状态,也不会拦截上传过程中的异常。如果文件还在传输中、或者上传过程中触发了网络错误/权限错误导致上传失败,代码会直接走到获取下载链接的逻辑,此时存储桶中还没有对应的文件,自然会抛出对象不存在的错误。- 代码未做上传前的文件有效性校验、未捕获上传阶段的异常,出现本地文件损坏、路径无写入权限、存储配额耗尽等问题时,也会触发同类错误。
修复方案
- 调整上传等待逻辑,去掉
whenComplete的写法,直接await上传任务获取TaskSnapshot,同时增加上传状态校验、异常捕获逻辑,确认文件上传成功后再请求下载链接。
修复后的代码如下:
Future<String> uploadFile(File _image) async { // 上传前先校验本地文件是否存在 if (!await _image.exists()) { throw Exception('待上传的本地文件不存在'); } int uploadTimestamp = DateTime.now().millisecondsSinceEpoch; Reference ref = FirebaseStorage.instance.ref().child('posts/$uploadTimestamp'); try { // 直接等待上传任务执行完成,失败会直接抛出Firebase异常 final TaskSnapshot taskSnapshot = await ref.putFile(_image); // 校验上传状态为成功后再获取下载地址 if (taskSnapshot.state == TaskState.success) { final String downloadUrl = await taskSnapshot.ref.getDownloadURL(); return downloadUrl; } throw Exception('文件上传未完成,当前状态:${taskSnapshot.state}'); } on FirebaseException catch (e) { // 可按需处理上传阶段的各类异常,比如网络错误、权限不足、配额耗尽等 rethrow; } }
- 额外排查项:
- 确认Firebase Storage控制台已初始化完成,存储桶处于正常可用状态
- 确认Firebase Storage安全规则给当前操作用户开放了对应路径的写入权限,测试阶段可临时配置规则为认证用户可读写,快速排除权限拦截问题
- 确认本地待上传文件大小没有超过Firebase Storage的配额或配置的单文件大小上限
内容的提问来源于stack exchange,提问作者segun code
相关产品推荐
相关产品推荐

