Flutter中Firebase Storage上传进度未达100%返回TaskState.success问题
问题原因
- 这是Flutter
firebase_storage插件的已知历史Bug,多出现于支持断点续传的旧版本插件中,核心问题是网络中断恢复后,SDK的进度统计逻辑与任务状态判断逻辑不同步:- 轻量场景下是进度统计错误:插件未正确同步完整文件的总大小到
snapshot.totalBytes字段,仍使用断网前已加载的分片总大小作为计算分母,导致进度计算值偏低,实际文件已完整上传; - 你遇到的是更严重的状态误判场景:SDK的重试逻辑误将分片上传的成功响应识别为整个文件上传完成的信号,提前触发
TaskState.success,但剩余分片并未完成上传,最终导致存储桶内的文件不完整。
你提供的日志完全匹配第二种场景:断网恢复后仅上传了1个分片就触发了success回调,进度停留在69%,剩余31%的内容未实际完成上传。
- 轻量场景下是进度统计错误:插件未正确同步完整文件的总大小到
解决方案
1. 根源修复
直接将firebase_storage插件升级到v11.0.0及以上的最新稳定版即可,官方已经在新版本中修复了断点续传的状态判断逻辑错误问题。
2. 无内存占用的文件完整性校验方案
如果你暂时无法升级插件,可以用以下不需要持久化存储所有任务进度的方案做校验:
- 上传前仅记录一次本地文件的总字节大小或MD5/CRC32校验值(仅存单个数值,内存占用可忽略),上传任务触发success回调后,拉取存储桶对应文件的元数据做对比:
// 上传完成后执行校验逻辑 final fileRef = FirebaseStorage.instance.ref().child("目标文件存储路径"); final fileMetadata = await fileRef.getMetadata(); // 方案1:对比文件大小 if (fileMetadata.size != localFileTotalBytes) { // 文件不完整,取消旧任务后重新上传 await currentTask.cancel(); // 重新创建UploadTask执行上传逻辑 } // 方案2:对比MD5校验值,准确率更高 if (fileMetadata.md5Hash != localFileMd5) { // 同上,重新触发上传 }
3. 临时规避方案
也可以在监听到TaskState.success状态时,额外判断snapshot.bytesTransferred是否等于预先记录的本地文件总字节数,数值不等即可判定为假成功,直接触发任务续传即可。
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

