var
ConInfo: TAmazonConnectionInfo;
RespInfo: TCloudResponseInfo;
Service: TAmazonStorageService;
Content: TBytes;
Headers: TStringList;
begin
ConInfo:=TAmazonConnectionInfo.Create(self);
ConInfo.AccountName:='YOUR ACCOUNT NAME';
ConInfo.AccountKey:='YOUR ACCOUNT KEY';
ConInfo.Protocol:='http';
Service:=TAmazonStorageService.Create(ConInfo);
RespInfo:=TCloudResponseInfo.Create;
SetLength(Content, 128);
FillMemory(@Content[0], 128, Byte('x'));
Headers:=TStringList.Create;
Headers.Values['Content-type']:='text/plain';
if not Service.UploadObject('YOUR BUCKET', 'test.txt', Content, TRUE, nil, Headers, amzbaPrivate, RespInfo) then
ShowMessage('Failed:' + RespInfo.StatusMessage);
在调用 UploadObject 时,我总是遇到错误:
失败:HTTP/1.1 403 禁止 - 我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。(SignatureDoesNotMatch)
只有当 Content-type 设置为 'text/plain'、'text/html' 或任何文本内容时才会出现这种情况。如果您使用完全相同的代码,只是将 content-type 更改为其他任何 content-type,例如 'video/3gpp',那么它就能正常工作且没有错误。上传的对象的实际内容并不相关,也不影响是否出现错误。
我已经跟踪了 Delphi 中的 Indy 代码,但我对于为什么文本内容类型总是出现此错误感到困惑。
有什么想法吗?