在FirebaseStorage中控制用户图像

时间:2019-10-17 15:54:48

标签: java android firebase firebase-storage

我正在使用Firebase在Android上制作社交应用。每个用户最多可以上传三个图像,这些图像使用FirebaseStorage存储。

Activity where users add photos

我正在使用用户的唯一ID命名照片。因此,例如,将用户的照片命名为:userid_1.jpg,userid_2.jpg,userid_3.jpg

我正在将第一张图片用作用户的个人资料图片。一切都很好,但我想允许用户删除照片并添加新照片。

例如,用户有三张照片并删除了第一张照片,因此现在photo2移到photo1的位置,而photo3占据photo2的位置。这样我就可以轻松地在活动中获得这种效果:

photo1ImageView.setImageDrawable(photo2ImageView.getDrawable());
photo2ImageView.setImageDrawable(photo3ImageView.getDrawable());
photo3ImageView.setImageResource(R.drawable.addphotoicon);

但是现在的问题是如何在FirebaseStorage中处理此问题。所以很明显,我从删除图片开始。

FirebaseStorage.getInstance().getReference().child("images").child(userID + "_1.jpg").delete();

然后我想做的就是重命名其余两张图片。

因此,删除photo1后,userid_1.jpg掉落了,userid_2.jpg变成了userid_1.jpg,userid_3.jpg变成了userid_2.jpg

但是无法在FirebaseStorage中重命名文件。因此,现在在下次加载此活动时,它将把photo2放在第二个ImageView中,将photo3放在第三个ImageView中,而将第一个ImageView留为空白。个人资料图片(userid_1.jpg)也将丢失。这不是我想要的行为。

我想到的另一种方法是:每当删除一张照片时,我都会删除所有用户的照片,并使用正确的名称重新上传其余的照片,但这在Firebase上非常低效且不必要。

我只是想知道是否有人可以想到一种有效的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

Cloud Storage在维护上传到其上的对象的顺序方面不是很好。甚至大多数普通的计算机文件系统都不适合这样做。

我建议放弃存储将保持任何顺序或序列的想法,并将该逻辑完全移入数据库或其他数据存储,这确实使您能够轻松地对其中的项目进行排序。上传到存储设备的文件名可以是随机的-不需要任何含义。您只需要将它们的路径存储在数据库的相关记录中,并使两者保持同步即可。

答案 1 :(得分:0)

您可以在此处应用一些技巧。
将用户照片参考作为对象数组存储到数据库中。为您的照片创建模型类。看起来像这样:

class UserPhoto {
    var photoRef: String? = null //Reference of your photo in Cloud Storage
    var downloadUrl: String? = null //This is optional, but very handy.
    var timestamp: Long? = null // In milseconds
    var order: Int = -1
}

在这里您可以看到“时间戳记”,“顺序”是查找照片是否为最新照片的关键。只需将此数据存储为用户文档中的数组即可。每张照片将具有此数据。然后,您可以根据此数据模型为每张用户照片将逻辑放入应用程序/服务器中。