【问题标题】:How generate a MD5 in delphi for azure blob storage?如何在 delphi 中为 azure blob 存储生成 MD5?
【发布时间】:2012-05-02 07:15:22
【问题描述】:

我尝试为要上传到 azure 的文件设置 MD5 哈希。我收到此错误:

(400, 'HTTP/1.1 400 请求中指定的 MD5 值是 无效的。 MD5 值必须是 128 位和 base64 编码。', $7230400)

这就是我为文件做 md5 的方式:

function MD5(const fileName : string) : string;
var
 idmd5 : TIdHashMessageDigest5;
 fs : TFileStream;
begin
 idmd5 := TIdHashMessageDigest5.Create;
 fs := TFileStream.Create(fileName, fmOpenRead OR fmShareDenyWrite) ;
 try
   result := idmd5.HashStreamAsHex(fs) ;
 finally
   fs.Free;
   idmd5.Free;
 end;
end;

......


Headers.Values['Content-MD5'] :=  MD5(LocalFile);

现在,根据 delphi xe2 上的 azure 规范如何做到这一点?

PD:这个答案How to resolve an InvalidMd5 error returned from the Windows Azure Blob Storage service? 为.NET 解决它:

MD5 md5 = new MD5CryptoServiceProvider();
byte[] blockHash = md5.ComputeHash(buff);
string convertedHash = Convert.ToBase64String(blockHash, 0, 16);

但是不知道怎么翻译成delphi..

【问题讨论】:

  • 如果您将数据转储到文件中,然后使用免费的 MD5 计算器之一,您是否得到相同的答案?在尝试对计算器进行故障排除之前,我将从那里开始,因为您的计算可能没有任何问题。也就是说,您假设 Azure 不喜欢您的 MD5,但也许 Azure 不喜欢您的文件。
  • 我用 osx md5 命令行对同一个文件进行了相同的测试。

标签: delphi md5 delphi-xe2 azure-storage


【解决方案1】:

您应该注意 XE2 中 Azure 代码中的错误(此链接还显示了如何创建和格式化 MD5 哈希值):

EIPHTTPProtocolExceptionPeer exception using PutBlock with array of bytes all set to zero

编辑:

相关代码:

Hasher:=TIdHashMessageDigest5.Create;
MD5:=Data.Cloud.CloudAPI.EncodeBytes64(Hasher.HashBytes(Content));
Hasher.Free;

【讨论】:

    【解决方案2】:

    我不知道 delphi XE2 的 HashStreamAsHex() 函数,但在较旧的 Delphi 版本中,您分两步完成:idmd5.AsHex(idmd5.HashValue(fs)) 以下是您可能可以使用的旧 Delphi 版本的示例代码。 http://delphi.about.com/od/objectpascalide/a/delphi-md5-hash.htm

    【讨论】:

      【解决方案3】:

      我根本不了解 Delphi,但错误消息说您的 MD5 哈希应该是 base64 编码,但您似乎使用的是十六进制编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-14
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        • 2018-10-30
        • 2021-08-31
        相关资源
        最近更新 更多