使用Delphi XE2 Update 3,将一个零字节的块上传到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的调用将引发异常:
项目Project1.exe引发异常类
EIPHTTPProtocolExceptionPeer与消息“ HTTP / 1.1 403服务器失败
验证请求。确保授权值
标头的格式正确,包括签名。
但是,如果您更改FillMemory行,使其填充为1(或除零以外的任何值),则它将正常工作。为什么?
谢谢你的帮助。
最佳答案
令人难以置信的是,问题似乎出在ttgbNgpWctgMJ0MPORU + LA ==的块ID值
如果将其用作块ID,则会收到该错误。