我正在编写一个脚本,该脚本使用适用于 NodeJS 的 Azure SDK 下载 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 哈希是正确的。
我的问题分为两部分:
- 如果我在下载 blob 时传递从 Azure 收到的值,MD5 哈希值怎么可能不正确?
Azure 如何计算 MD5 哈希值?我无法重新计算哈希值,因为他们正在对 MD5 哈希值进行其他一些加密/操作以将其转换为不同的格式,并且我找不到有关他们如何编码 MD5 哈希值的文档。以下是来自 Azure 的“MD5”哈希示例,显然不是 MD5 格式:
8kz7pLKnPFlF5G6gy+0rrg==
谢谢。
最佳答案
您在项目中使用了哪个版本的 Azure-storage-node
模块,根据 GitHub 上的问题 https://github.com/Azure/azure-storage-node/issues/78 ,如果sdk版本在0.6.0以下,可能会出现此问题,您可以先检查sdk的版本。
我们可以找到calculateMD5
function在 GitHub 存储库上。这表明它将利用 blob 文件的内容在 md5
中创建哈希对象,并以 base64
进行编码作为 contentMD5
的返回值。
因此,根据Azure Blob存储sdk中计算MD5 key 的方法,您可以检查本地将上传到Azure存储的文件与从存储下载的文件是否相同。
关于node.js - Azure SDK - NodeJS - 重新上传 blob 时 MD5 哈希值无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35135215/