Azure SDK - NodeJS - 重新上载blob时出现无效的MD5哈希值

时间:2016-02-01 16:17:12

标签: node.js azure md5 azure-storage

我正在编写一个脚本,该脚本使用Azure SDK for NodeJS下载blob列表,并将blob重新上传到不同的存储容器。

var service = azure.createBlobService();

// download file
service.getBlobToLocalFile(fromContainer, blob, localBlob, function(err, resp){ // resp here contains the MD5 hash

    // re-upload file specifying hash
    service.createBlockBlobFromLocalFile(toContainer, blob, localBlob, {contentMD5: resp.contentMD5}, function(error){}); // error here contains MD5 mis-match error
}); 

一些blob - 不是全部 - 在上传时抛出错误,说blob中的MD5哈希是不正确的,即使我从getBlob操作传递MD5哈希:

Error: The MD5 value specified in the request did not match with the MD5 value calculated by the server.

此错误仅发生在某些blob上。其他blob上传成功,这意味着MD5哈希是正确的。

我的问题是2部分:

  1. 如果我在下载blob时传递从Azure收到的值,MD5哈希怎么可能不正确?
  2. Azure如何计算其MD5哈希值?我无法重新计算哈希值,因为他们正在对MD5哈希进行其他加密/操作以将其置于不同的格式,我无法找到有关它们如何编码MD5哈希的文档。这是一个例子" MD5"来自Azure的哈希显然不是MD5格式:

    8kz7pLKnPFlF5G6gy + 0rrg ==

  3. 谢谢。

2 个答案:

答案 0 :(得分:2)

您在项目中使用的Azure-storage-node模块的版本,根据https://github.com/Azure/azure-storage-node/issues/78上的GitHub上的问题,如果sdk版本低于0.6.0,则可能会出现此问题,您可以查看版本首先是sdk。

我们可以在GitHub回购中找到calculateMD5 function。这表明它将在md5中利用blob文件的内容创建哈希对象,并在base64中编码为contentMD5的返回值。

因此,根据计算Azure blob存储sdk中的MD5密钥的方法,您可以检查本地上的文件是否将上传到Azure存储与从存储中下载的文件是否相同。

答案 1 :(得分:2)

我在Windows下使用Azure SDK for NodeJS 5.4.1测试了您的代码。它运作良好。 MD5问题没有出现。我认为最好更换新版本的NodeJs Server。以下是Node.js服务器的一些链接:

Windows安装:http://go.microsoft.com/fwlink/?linkid=254279&clcid=0x409

linux install:http://go.microsoft.com/fwlink/?linkid=253472&clcid=0x409

mac install:http://go.microsoft.com/fwlink/?linkid=253471&clcid=0x409