使用 Delphi XE2 Update 3 我在将零字节 block 上传到 Azure 时遇到问题。当我说零字节时,我的意思是每个元素设置为零的字节数组(不是零长度)。
例如:
var
ConInfo: TAzureConnectionInfo;
RespInfo: TCloudResponseInfo;
BlobService: TAzureBlobService;
Content: TBytes;
MD5: String;
Hasher: TIdHashMessageDigest5;
begin
ConInfo:=TAzureConnectionInfo.Create(self);
ConInfo.AccountName:='YOUR ACCOUNT NAME';
ConInfo.AccountKey:='YOUR ACCOUNT KEY';
ConInfo.Protocol:='http';
BlobService:=TAzureBlobService.Create(ConInfo);
RespInfo:=TCloudResponseInfo.Create;
SetLength(Content, 1048576); // 1 MByte
FillMemory(@Content[0], 1048576, 0); // << --- fill it with anything except 0 and it works
Hasher:=TIdHashMessageDigest5.Create;
MD5:=Data.Cloud.CloudAPI.EncodeBytes64(Hasher.HashBytes(Content));
Hasher.Free;
BlobService.PutBlock('CONTAINER NAME', 'BLOB NAME', MD5, Content, MD5, '', RespInfo);
如果运行上述代码,则调用 PutBlock 时会引发异常:
Project Project1.exe raised exception class EIPHTTPProtocolExceptionPeer with message 'HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.'.
但是,如果您更改 FillMemory 行,使其用 1(或除零以外的任何值)填充,则它可以正常工作而不会出现错误。为什么?
感谢您的帮助。
最佳答案
令人难以置信的是,问题似乎出在ttgbNgpWctgMJ0MPORU+LA==的区 block ID值
如果您将其用作 block ID,则会收到该错误。
关于delphi - 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307637/