Firebase安卓应用头像存储:存gs协议地址还是HTTPS下载地址更推荐?
问题解答
1. 直接将原始HTTPS下载地址存储在Firestore中是否是推荐的做法?
该做法是官方推荐的、适配用户头像这类高频访问资源的最优实践,相关说明如下:
- 优势:可完全省去每次加载资源时调用
downloadUrl接口的冗余请求,降低图片加载延迟、提升用户体验,同时减少不必要的网络资源消耗。 - 注意事项:
- 下载URL附带的token与文件版本强绑定,如果后续覆盖上传了同路径的新头像,旧token会自动失效,此时需要重新生成新的HTTPS地址并更新Firestore中的对应字段。
- 只要不主动撤销文件访问令牌、不覆盖同路径文件,生成的HTTPS下载地址长期有效,可放心存储使用。
2. 如果该做法是合理的,有没有不需要调用Storage的downloadUrl接口就能获取HTTPS下载地址的方法?
目前不存在本地拼接或离线生成合法HTTPS下载地址的可行方案:地址中的token参数是Firebase Storage后端生成的唯一访问凭证,无法通过本地规则计算得到。
你可以采用以下方案实现最优性能,规避每次加载都调用downloadUrl的冗余问题:
在用户上传头像到Storage成功的回调中,仅调用1次downloadUrl接口获取HTTPS地址,直接将该地址写入Firestore对应用户的profile_url字段即可。后续所有头像加载场景,都可直接读取Firestore中存储的HTTPS地址使用Glide加载,不需要再和Storage接口交互。
示例代码参考:
// 头像文件上传逻辑 val avatarRef = storage.reference.child("avatar${userId}.png") avatarRef.putFile(userSelectedAvatarUri) .addOnSuccessListener { // 上传成功后仅调用一次downloadUrl avatarRef.downloadUrl.addOnSuccessListener { httpsUrl -> // 将HTTPS地址持久化到Firestore firestore.collection("user") .document(userId) .update("profile_url", httpsUrl.toString()) } }
补充可选方案:如果不想自行管理下载URL的存储逻辑,可引入Firebase官方的Glide集成组件,组件会自动完成gs地址到下载URL的转换,无需手动编写
downloadUrl调用逻辑,但该方案本质上仍会在首次加载图片时发起请求获取URL,性能低于提前存储HTTPS地址的方案。
参考官方文档内容翻译
Firebase Storage下载文件相关官方说明:你可通过SDK生成文件的公开长期下载URL,该URL附带唯一访问令牌,在你主动撤销令牌或覆盖对应文件前始终有效。对于需要频繁访问的资源,将生成的下载URL存储在云数据库中是最优实践,可避免每次访问都重复生成URL的额外开销。
内容的提问来源于stack exchange,提问作者Tangibleidea
相关产品推荐
相关产品推荐

