【问题标题】:CONTENT-MD5 is missing AZURE portalCONTENT-MD5 缺少 AZURE 门户
【发布时间】:2017-10-29 15:42:28
【问题描述】:

我正在使用 c# 库在 AZURE blob 存储中上传文件。如果我使用 byte[] 上传文件,它会计算 MD5(在 AZURE 门户中验证 - 显示 CONTENT-MD5 值)。

CloudBlockBlob blockBlob = GetUserProjectsBlob(blobName);
blockBlob.UploadFromByteArray(file, 0, file.Length);

我需要将一个大文件上传到 AZURE。所以我正在使用 PutBlock 和 PutBlockList 方法..

string blockHash = GetMd5FromStream(new MemoryStream(file));
blockBlob.PutBlock(blockId, new MemoryStream(file, true), blockHash);
// To commit transaction
blockBlob.PutBlockList(blockIDsBase64);

但在上述情况下,AZURE 门户中缺少 CONTENT-MD5。这个我也试过了。。

BlobRequestOptions opt = new BlobRequestOptions();
opt.StoreBlobContentMD5 = true;
UseTransactionalMD5 = true;
blockBlob.PutBlockList(blockIDsBase64, null, opt);

但仍然没有运气。关于如何解决这个问题的任何想法?

【问题讨论】:

  • 您通过代码执行此操作是否有原因?我只是问,因为如果您只是复制文件,AZCopy 可能会更好
  • @JasonH 我将它用于 WebApi。
  • 我对另一个技术细节很感兴趣 - 您是否有理由逐块上传它?为什么全 Blob 上传 API(UploadFromFIleUploadFromStream、...)不适合您?

标签: c# azure blob md5


【解决方案1】:

在以下代码行中:

string blockHash = GetMd5FromStream(new MemoryStream(file));
blockBlob.PutBlock(blockId, new MemoryStream(file, true), blockHash);
// To commit transaction
blockBlob.PutBlockList(blockIDsBase64);

您实际上是在计算块数据的 MD5 哈希值。当 Storage Service 接收到这些数据时,它会进行哈希验证,以确保块数据没有损坏。

BlobRequestOptions opt = new BlobRequestOptions();
opt.StoreBlobContentMD5 = true;
UseTransactionalMD5 = true;
blockBlob.PutBlockList(blockIDsBase64, null, opt);

以上代码不会指示存储服务计算您上传的 blob 的哈希值。您需要自己计算 blob 的 MD5 哈希并将其作为属性的一部分发送,执行如下操作:

blockBlob.Properties.ContentMD5 = "computed hash";
blockBlob.PutBlockList(blockIDsBase64, null, opt);

【讨论】:

  • 当您上传文件而不将其分成块时,SDK 会计算 MD5 哈希值,这就是它存在的原因。如果您通过分块上传文件,SDK 不会计算哈希值。
  • 是的,如果您使用自己的阻止列表上传,则必须手动为“合并时的所有块”添加理论 MD5。 stackoverflow.com/a/69319211/32453
猜你喜欢
  • 2018-09-16
  • 2020-11-24
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多