4

我在 microsoft azure 中存储了一些图片。上传和下载运行良好。但我想用 md5-hash 验证上传的数据,独立于上传和下载。所以这是我的代码(整个连接和帐户都有效。容器也不为空):

public String getHash(String remoteFolderName, String filePath) {

    CloudBlob blob = container.getBlockBlobReference(remoteFolderName + "/" + filePath);

    return blob.properties.contentMD5
}

问题是,我总是为每个 blob 获得 null。我是以正确的方式做的还是有其他的可能性来获得一个 blob 的 md5-hash?

4

2 回答 2

4

我已经解决了这个问题,就像 smarx 提到的那样。在上传之前,我计算文件的 md5-Hash 并在 blob 的属性中更新它:

import java.security.MessageDigest
import com.microsoft.windowsazure.services.core.storage.utils.Base64;
import com.google.common.io.Files

String putFile(String remoteFolder, String filePath){
    File fileReference = new File (filePath)
    // the user is already authentificated and the container is not null
    CloudBlockBlob blob = container.getBlockBlobReference(remoteFolderName+"/"+filePath);
    FileInputStream fis = new FileInputStream(fileReference)
    if(blob){
        BlobProperties props = blob.getProperties()

        MessageDigest md5digest = MessageDigest.getInstance("MD5")
        String md5 = Base64.encode(Files.getDigest(fileReference, md5digest))

        props.setContentMD5(md5)
        blob.setProperties(props)
        blob.upload(fis, fileReference.length())
        return fileReference.getName()
   }else{
        //ErrorHandling
        return ""
   }
}

文件上传后,我可以使用以下方法获取 ContentMD5:

String getHash(String remoteFolderName, String filePath) {
    String fileName = new File(filePath).getName()
    CloudBlockBlob blob = container.getBlockBlobReference(remoteFolderName+"/"+filePath)
    if(!blob) return ""
    blob.downloadAttributes()
    byte[] hash = Base64.decode(blob.getProperties().getContentMD5())
    BigInteger bigInt = new BigInteger(1, hash)
    return bigInt.toString(16).padLeft(32, '0')
} 
于 2012-06-10T08:17:34.603 回答
2

只有在上传 blob 时设置了 MD5 哈希值,它才可用。有关更多详细信息,请参阅此帖子:http: //blogs.msdn.com/b/windowsazurestorage/archive/2011/02/18/windows-azure-blob-md5-overview.aspx

是否有可能从未为这些 blob 设置 MD5 哈希?

于 2012-06-08T18:45:21.680 回答