【发布时间】:2012-05-06 23:05:11
【问题描述】:
使用以下 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 时总是出错:
Failed:HTTP/1.1 403 Forbidden - 我们计算的请求签名 与您提供的签名不匹配。检查您的密钥和签名 方法。 (SignatureDoesNotMatch)
仅当 Content-type 设置为“text/plain”、“text/html”或任何文本时才会发生这种情况。使用完全相同的代码,如果您只是将内容类型更改为任何其他内容类型,例如'video/3gpp',然后它按预期工作并且没有错误。正在上传的对象的实际内容不相关,并且与是否出现错误无关。
我已经在 Delphi 中跟踪过 Indy 代码,但我对为什么 text 内容类型总是给出这个错误感到困惑。
有什么想法吗?
【问题讨论】:
标签: delphi amazon-s3 content-type indy http-status-code-403