Flutter使用firebase_storage 8.0.4版本删除文件报object-not-found错误
问题根因
该报错与存储权限、目标文件是否存在无关,核心是firebase_storage 8.0.4版本调整了SDK的引用构造逻辑:
- 旧版本SDK存在隐式兼容:将完整可访问的文件下载URL传入
ref()方法时,SDK会自动从URL中解析出存储桶内部的相对对象路径,构造合法引用 - 8.0.4版本移除了该兼容逻辑,
ref()方法现在仅接受存储桶内部的相对路径作为入参;如果传入http/https开头的完整外网URL,SDK会把整段URL字符串当成相对路径查找对象,自然无法匹配到对应文件,触发object-not-found异常 - 你打印的
fullPath输出为完整的图片访问链接,直接印证了该问题:合法存储引用的fullPath应为不带域名、不带查询参数的内部路径格式。
修复方案
- 凡是入参为完整外网文件URL的场景,禁止直接传给
ref(),改用SDK提供的refFromURL()方法解析构造合法引用 - 正确代码示例:
// 原有错误写法 // Reference s = _storage.ref("传入完整的图片访问URL"); // 替换后正确写法 String fullImageUrl = "对应目标文件的完整可访问URL"; Reference s = _storage.refFromURL(fullImageUrl); // 此时打印的fullPath应为内部相对路径,如"uploads/2024/avatar.jpg" print(s.fullPath); // 执行删除操作,补充异步等待与异常捕获 try { await s.delete(); } catch (e) { // 处理其他类型的删除异常 }
- 全量排查项目内所有
ref()方法的调用位置,凡是入参以http:///https://开头的代码,全部替换为refFromURL()的解析逻辑,避免同类问题。
注意:无需调整Firebase Storage安全规则,你可以通过URL正常打开对应图片,说明文件本身存在、权限配置正常,问题仅为代码层面的存储引用构造逻辑错误。
内容的提问来源于stack exchange,提问作者Ardel ALegre
相关产品推荐
相关产品推荐

