我有一个应用程序,我需要上传几个图像,一切正常,事情就是这样。
如果我重新加载相同的图片,他们会在存储中被替换,只上传那些不存在的图片(这很好,预计会像这样工作)
现在,当照片上传到存储器时,它会为数据库中的每个照片生成一个下载链接,就是当我重新上传更多文件时,它会再次为每个图像创建所有下载链接,我想要的只是继续添加新的,而不是使用不同的键重新上载所有相同的链接
以下是问题的图片:
红色框表示我在每个链接中存储的所有文件,下面的键代表相同文件的不同链接,所以问题是每次不同的键都会推送具有相同文件的链接,我想只保留红色方块的链接,这些链接是上传文件时创建的第一个红色方块。我有这个代码将链接上传到数据库
File[] filesInFolder = folder.listFiles(); // This returns all the folders and files in your path
for (File file : filesInFolder) { //For each of the entries do:
if (!file.isDirectory()) { //check that it's not a dir
result.add(new String(file.getName())); //push the filename as a string
Log.e("Files",""+new String(file.getName()));
final StorageReference referenciaFotos = mStorageRef.child("Archivos_Usuarios").child("Fotos").child(new String(file.getName()));
referenciaFotos.putFile(Uri.fromFile(file)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
String urlFoto = taskSnapshot.getDownloadUrl().toString();
Log.e("PhotoUrl",""+urlFoto);
String pushKey = mDatabase.push().getKey();
Log.e("pushKey",""+pushKey);
mDatabase.child("Usuarios").child(uid).child("URL_FotosUsuario").child(pushKey).setValue(urlFoto);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(GaleriaGrupos2.this, "Can't Upload photos, try again later", Toast.LENGTH_SHORT).show();
}
});
}
}
我正在使用此代码首先列出文件夹中的所有文件,然后上传每个文件并将每个下载链接上传到该文件的数据库,现在当我再次启动该方法时,它将生成新文件每次都有相同链接的随机密钥,但文件不会在存储中被替换。
答案 0 :(得分:1)
这就是push()
方法的作用,它每次调用时都会生成随机密钥,这也是代码中发生的事情。除非您检查数据库中是否已存在这些特定文件,否则它不会停止。为此,我建议您遍历Firebase数据库中的所有子项并查看它是否存在,并且只有在不存在的情况下才使用push()
方法。
答案 1 :(得分:1)
每当您发现自己尝试检查某个值是否已存在时,请考虑将该值用作键。这是因为在Firebase中难以控制唯一的值,但键根据定义自动唯一。
假设您有以下网址:
https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e
https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada
https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20
如果您像现在一样使用推送ID存储它们,那么您将获得这样的JSON对象:
{
"-L8A7CfqTeGu5O4ZZG-G": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e",
"-KuOdWgSuZUpvfpj_4hJ": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada",
"-KkRiogHRn0MeItVNu2J": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20"
}
但是,让我们看看当我们改为基于URL本身的密钥时会发生什么。如果您只在Cloud Storage for Firebase中存储图像,快速方法是认识到大多数URL都是相同的。因此,让我们只使用每个下载URL的唯一位:
{
"images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRiyO2d5CGLgj17OHv?alt=media&token=ec9a3135-5552-44b6-a29d-63e92ecb5c1e",
"images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRjDAq7Wn-J7UHGqlg?alt=media&token=ab65d303-69ce-4689-b5dc-dcb00fb31ada",
"images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20": "https://firebasestorage.googleapis.com/v0/b/z2a-emojichat.appspot.com/o/images%2F-KkRj_tlL16qMDQSq3Uo?alt=media&token=e2d88eeb-85cb-4ef9-9e06-ee828eea8d20"
}
现在,由于密钥基于URL本身,如果您尝试再次添加相同的URL,则最终会使用相同的密钥。根据定义,您可以保证每个网址只存储一次。