上传图片至Firebase Storage时触发路径无对应对象存储异常
Firebase Storage 上传报"Object does not exist at location"修复指南
该报错的核心诱因分为代码竞态问题、存储配置不匹配、权限拦截三类,对应排查和修复方案如下
- 优先修复代码层面的竞态触发问题
你当前的代码在putFile的成功回调触发后,立刻单独发起ref.getDownloadUrl()请求,此时服务端刚完成文件写入流程,对象索引信息还未同步完成,过早发起的查询请求就会直接触发"对象不存在"的异常。
新版Firebase Storage SDK的上传任务成功回调中,UploadTask.TaskSnapshot对象已经关联了可正常访问的对象引用,不需要单独重复发起下载URL请求,可直接替换对应逻辑:ref.putFile(filePath) .addOnSuccessListener(taskSnapshot -> { progressDialog.dismiss(); // 直接从任务快照的关联引用获取下载地址,避免竞态查询 taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(uri -> { // 原有写入数据库的业务逻辑保持不变 }); }); - 排查存储实例绑定配置
如果在Firebase控制台手动修改过默认存储桶名称、关联了多项目存储资源,直接调用FirebaseStorage.getInstance()获取的默认实例,可能和实际上传写入的存储桶不是同一个,就会出现代码往A桶上传、去B桶查询的错位问题。可通过打印当前实例的bucket属性,和控制台显示的存储桶名称做匹配校验。 - 校验Storage安全规则拦截逻辑
如果安全规则没有正确配置读写权限,上传请求可能被规则直接拦截,虽然客户端可能因为网络层的回调时序问题触发了onSuccess,但文件根本没有真正写入存储桶,后续查询时自然找不到对应对象。
可临时将测试规则调整为登录用户可读写所有路径,验证是否为规则拦截导致的文件未实际落库:rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } } - 校验本地文件的读取权限
如果是通过系统相册、文件选择器拿到的图片Uri,没有申请对应的临时读权限,putFile实际上传的是空内容,服务端不会生成有效可访问的存储对象。可在启动上传前,给Uri申请临时持久读权限:getContentResolver().takePersistableUriPermission( filePath, Intent.FLAG_GRANT_READ_URI_PERMISSION ); - 路径拼接优化
当前拼接的存储路径images/UUID字符串没有携带文件后缀,部分存储桶的配置会对无后缀的空索引对象做过滤,可补充本地文件的mime类型后缀到路径末尾,提升对象索引的可靠性。
内容的提问来源于stack exchange,提问作者just askin'
相关产品推荐
相关产品推荐

