我正在尝试使用firebase数据库和存储来构建社交媒体应用程序。以下是预期的流程。
用户上传存储在当前用户文件夹中的firebase存储中的个人资料图片以及存储在firebase数据库中的URL,以便快速访问。 (工作正常)
用户发表他们的想法。这可以保存用户信息,例如数据库中的帖子消息,用户名和个人资料图片URL。 (工作正常)。
现在的问题是用户更新了他或她的个人资料图片,这会覆盖firebase存储中的旧配置文件图像(为了管理存储并使用户图像在所有评论和帖子中相同)。在帖子消息活动中,无法访问较旧的配置文件图像URL,导致令牌更改。
我想知道如何解决这个问题,以便firebase存储URL在所有更新中都是静态的(相同)。
使用Picasso而非firebase方法获取图像
答案 0 :(得分:2)
由于URL图像存储在数据库中,因此您可以使用Cloud Function在用户更新其图片后更新该值。
您可以触发云功能以响应云存储中文件的更新,请参阅:
https://firebase.google.com/docs/functions/gcp-storage-events
找到云功能的示例 的完整文档答案 1 :(得分:2)
尽管这个问题被问了很长时间,但是我注意到有些人仍然很难解决这个问题,所以我将在下面提供解决方案。
步骤1 由于更改时存储URL始终是动态的(即posses令牌),所以我所做的就是对所有用户使用通用名称存储图像文件,例如 avatar
第2步 在存储中为每个用户创建一个目录,如下所示:users / {uid} /avatar.jpg
第3步 使用步骤2中的路径拉出或显示图像(见下文)
ANDROID
StorageReference storageReference = FirebaseStorage.getInstance().getReference("users").child(userId).child("avatar.jpg");
Glide.with(context).using(new FirebaseImageLoader()).load(storageReference).diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.ch_white_icon).placeholder(R.drawable.ch_white_icon).into(imageView);
WEB
var storage = firebase.storage();
var pathReference = storage.ref('users/' + userId + '/avatar.jpg');
pathReference.getDownloadURL().then(function (url) {
$("#large-avatar").attr('src', url);
}).catch(function (error) {
// Handle any errors
});
有了这个,您就不必再担心动态链接了,每当您将新图像上传到上述路径时,它都会覆盖前一个图像,并且步骤3中的代码将为您提供新图像。
PS:对于Android,如果您不想滑行缓存图像,请不要忘记将DiskCacheStrategy.ALL更改为DiskCacheStrategy.NONE;如果允许缓存,则可以使用时间戳获取新图像