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==
我得到相同的輸出。似乎使用getMD5方法存在問題。因爲如果我用其中一個字符串替換它,例如,zy1sZIW0XO6kH01g9LgFfw ==它似乎適用於該字符串,並且它忽略將其打印出來。 例如:如果(! 「zy1sZIW0XO6kH01g9LgFfw ==」 的compareTo(storageMetadata.getMd5Hash())= 0) - 這將工作 如果(getMd5OfFile(getFilesDir()+ 「/圖片/ IMG_」 + finalI +」。 jpg「)。compareTo(」zy1sZIW0XO6kH01g9LgFfw ==「)!= 0) - 這不起作用 – branHazz
如果在'getMD5()'之後添加'.trim()'? (和'getMd5Hash()'後面) – gior91
謝謝! .trim()做了工作:) – branHazz