使用以下 Delphi XE2(更新 4)代码:
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 Forbidden - 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。(签名不匹配)
这仅在 Content-type 设置为 'text/plain'、'text/html' 或 text 任何内容时才会发生。使用完全相同的代码,如果您只是将内容类型更改为任何其他内容类型,例如“video/3gpp”,那么它会按预期工作且不会出错。正在上传的对象的实际内容不相关,并且与是否收到错误无关。
我已经通过 Delphi 中的 Indy 代码进行了跟踪,但我对为什么文本内容类型总是给出这个错误感到困惑。
有任何想法吗?