Firebase 存储 getMetadata() 问题

Posted

技术标签:

【中文标题】Firebase 存储 getMetadata() 问题【英文标题】:Firebase Storage getMetadata() issue 【发布时间】:2016-12-29 12:49:34 【问题描述】:

我一直在尝试从 Firebase 存储中获取图像文件的元数据 (md5hash),并检查它是否与用户手机上图像文件的 md5hash 不相等。问题是,即使哈希值相同,我得到的结果却是它们不同。

这是我试图获取元数据并进行比较的代码:

    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

【讨论】:

我得到相同的输出。使用 getMD5 方法似乎存在问题。因为如果我用其中一个字符串替换它,例如 zy1sZIW0XO6kH01g9LgFfw== 它似乎适用于该字符串,它会忽略将其打印出来。例如: if ("zy1sZIW0XO6kH01g9LgFfw==".compareTo(storageMetadata.getMd5Hash()) != 0) - 如果 (getMd5OfFile(getFilesDir() + "/Images/img_" + finalI + ".jpg"),这将起作用。 compareTo("zy1sZIW0XO6kH01g9LgFfw==") != 0) - 这行不通 如果在getMD5() 之后添加.trim()? (在getMd5Hash()之后)

以上是关于Firebase 存储 getMetadata() 问题的主要内容,如果未能解决你的问题,请参考以下文章

Firebase用户为已注册的用户返回空元数据

如何从 getMetaData.getColumns() 返回可滚动的结果集?

MediaControllerCompat 的 getMetadata 返回 null

创建实体实例导致 Reflect.getMetadata 不是函数

无法调用“java.sql.Connection.getMetaData()”,因为“<parameter2>”为空

无法使用AOT运行{N}应用程序,Reflect.getMetadata不是一个函数