2016-12-29 60 views
1

我一直在嘗試從Firebase存儲獲取圖像文件的元數據(md5hash),並檢查它是否與用戶手機上的圖像文件的md5hash不相等。問題是即使哈希值是相同的,我得到的結果是他們是不同的。Firebase存儲getMetadata()問題

這是我想獲得元數據和比較它的代碼:

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中使用此條件:

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

而不是! equals

+1

我得到相同的輸出。似乎使用getMD5方法存在問題。因爲如果我用其中一個字符串替換它,例如,zy1sZIW0XO6kH01g9LgFfw ==它似乎適用於該字符串,並且它忽略將其打印出來。 例如:如果(! 「zy1sZIW0XO6kH01g9LgFfw ==」 的compareTo(storageMetadata.getMd5Hash())= 0) - 這將工作 如果(getMd5OfFile(getFilesDir()+ 「/圖片/ IMG_」 + finalI +」。 jpg「)。compareTo(」zy1sZIW0XO6kH01g9LgFfw ==「)!= 0) - 這不起作用 – branHazz

+0

如果在'getMD5()'之後添加'.trim()'? (和'getMd5Hash()'後面) – gior91

+0

謝謝! .trim()做了工作:) – branHazz