Firebase存储网址随新标记

时间:2017-09-07 11:00:49

标签: android firebase firebase-realtime-database firebase-storage

我正在尝试使用firebase数据库和存储来构建社交媒体应用程序。以下是预期的流程。

  1. 用户上传存储在当前用户文件夹中的firebase存储中的个人资料图片以及存储在firebase数据库中的URL,以便快速访问。 (工作正常)

  2. 用户发表他们的想法。这可以保存用户信息,例如数据库中的帖子消息,用户名和个人资料图片URL。 (工作正常)。

  3. 问题

    现在的问题是用户更新了他或她的个人资料图片,这会覆盖firebase存储中的旧配置文件图像(为了管理存储并使用户图像在所有评论和帖子中相同)。在帖子消息活动中,无法访问较旧的配置文件图像URL,导致令牌更改。

    问题

    我想知道如何解决这个问题,以便firebase存储URL在所有更新中都是静态的(相同)。

    NB

    使用Picasso而非firebase方法获取图像

2 个答案:

答案 0 :(得分:2)

由于URL图像存储在数据库中,因此您可以使用Cloud Function在用户更新其图片后更新该值。

您可以触发云功能以响应云存储中文件的更新,请参阅:

https://firebase.google.com/docs/functions/gcp-storage-events

您可以在https://github.com/firebase/functions-samples

找到云功能的示例

以及https://firebase.google.com/docs/functions/

的完整文档

答案 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;如果允许缓存,则可以使用时间戳获取新图像