2016-12-29 2 views
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== 

ответ

1

Попробуйте использовать это условие в случае:

if (getMD5(getFilesDir() + "/Images/img_" + finalI + ".jpg").trim().compareTo(storageMetadata.getMd5Hash().trim()) != 0) { 
    //[...] 
} 

вместо ! equals

+1

я получаю тот же результат. Кажется, что есть проблема с использованием метода getMD5. Потому что, если я заменю его на одну из строк, например, zy1sZIW0XO6kH01g9LgFfw ==, похоже, она работает для этой строки и игнорирует ее печать. Например: если (.! "Zy1sZIW0XO6kH01g9LgFfw ==" CompareTo (storageMetadata.getMd5Hash()) = 0) - это будет работать если (getMd5OfFile (getFilesDir() + "/ Images/IMG_" + finalI +». jpg "). compareTo (" zy1sZIW0XO6kH01g9LgFfw == ")! = 0) - это не сработает – branHazz

+0

Если вы добавите' .trim() 'после' getMD5() '? (и после 'getMd5Hash()') – gior91

+0

Спасибо! .trim() выполнил работу :) – branHazz

Смежные вопросы