1
Я пытаюсь получить метаданные (md5hash) файла изображения из хранилища Firebase и проверить, не совпадает ли он с md5hash файла изображения на телефоне пользователя. Проблема в том, что, хотя хеши одинаковы, я получаю результат, что они разные.Firebase Storage getMetadata() issue
Это код, который я пытаюсь получить метаданные и сравнить его:
for(int i = 0; i<5; i++) {
StorageReference forestRef = storageRef.child("profile_images/img_" + (i + 1) + ".jpg");
final int finalI = i;
forestRef.getMetadata().addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
@Override
public void onSuccess(StorageMetadata storageMetadata) {
if (!getMD5(getFilesDir() + "/Images/img_" + finalI + ".jpg").equals(storageMetadata.getMd5Hash())) {
System.out.println("not equal");
//if image files differ then download them
System.out.println(storageMetadata.getMd5Hash());
System.out.println(getMD5(getFilesDir() + "/Images/img_" + finalI + ".jpg"));
StorageReference islandRef = storageRef.child("profile_images/img_" + (finalI + 1) + ".jpg");
final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
//download files here
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Uh-oh, an error occurred!
}
});
}
Это метод getMD5:
private String getMD5(String filePath)
{
String base64Digest = "";
try
{
InputStream input = new FileInputStream(filePath);
byte[] buffer = new byte[1024];
MessageDigest md5Hash = MessageDigest.getInstance("MD5");
int numRead = 0;
while (numRead != -1)
{
numRead = input.read(buffer);
if (numRead > 0)
{
md5Hash.update(buffer, 0, numRead);
}
}
input.close();
byte [] md5Bytes = md5Hash.digest();
base64Digest = Base64.encodeToString(md5Bytes, Base64.DEFAULT);
/*for (byte md5Byte : md5Bytes) {
returnVal += Integer.toString((md5Byte & 0xff) + 0x100, 16).substring(1);
}*/
}
catch(Throwable t) {t.printStackTrace();}
return base64Digest;
Я получаю этот выход:
I/System.out: not equal
I/System.out: zy1sZIW0XO6kH01g9LgFfw==
I/System.out: zy1sZIW0XO6kH01g9LgFfw==
I/System.out: not equal
I/System.out: wi2/XGYDD4ncHaNSRKct+A==
I/System.out: wi2/XGYDD4ncHaNSRKct+A==
I/System.out: not equal
I/System.out: DBmKPXhzYQcqGb/twjihEg==
I/System.out: DBmKPXhzYQcqGb/twjihEg==
I/System.out: not equal
I/System.out: beq6gp3s8cQ9Ky9Gn7/KoA==
I/System.out: beq6gp3s8cQ9Ky9Gn7/KoA==
I/System.out: not equal
I/System.out: tcuOskaSmP5HcaqCAszAuA==
I/System.out: tcuOskaSmP5HcaqCAszAuA==
я получаю тот же результат. Кажется, что есть проблема с использованием метода getMD5. Потому что, если я заменю его на одну из строк, например, zy1sZIW0XO6kH01g9LgFfw ==, похоже, она работает для этой строки и игнорирует ее печать. Например: если (.! "Zy1sZIW0XO6kH01g9LgFfw ==" CompareTo (storageMetadata.getMd5Hash()) = 0) - это будет работать если (getMd5OfFile (getFilesDir() + "/ Images/IMG_" + finalI +». jpg "). compareTo (" zy1sZIW0XO6kH01g9LgFfw == ")! = 0) - это не сработает – branHazz
Если вы добавите' .trim() 'после' getMD5() '? (и после 'getMd5Hash()') – gior91
Спасибо! .trim() выполнил работу :) – branHazz