2016-12-29 14 views
1

私はFirebase Storageから画像ファイルのメタデータ(md5hash)を取得しようとしていて、それがユーザの電話機の画像ファイルの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で次の条件を使用してください。

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

の代わりに、! equals

+1

と同じ出力が得られます。 getMD5メソッドの使用に問題があるようです。私はそれを文字列の1つに置き換えると、例えば、zy1sZIW0XO6kH01g9LgFfw ==それはその文字列のために働くように見えるので、それを印刷することを無視します。たとえば ます。if(。 "zy1sZIW0XO6kH01g9LgFfw ==" のcompareTo(storageMetadata.getMd5Hash())!= 0) - (getMd5OfFile(getFilesDir()+ "/画像/ IMG_" + finalI +あれば、これは」 に動作します。 – branHazz

+0

'getMD5()'の後に '.trim()'を追加するとどうなりますか? (そして 'getMd5Hash()の後ろ) – gior91

+0

ありがとう! .trim()は仕事をしました:) – branHazz

関連する問題