次の Delphi XE2 (update 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 - 計算したリクエストの署名が、提供された署名と一致しません。キーと署名方法を確認してください。(署名が一致しません)
これは、Content-type が「text/plain」、「text/html」、またはテキストに設定されている場合にのみ発生します。まったく同じコードを使用して、コンテンツ タイプを他のコンテンツ タイプ (たとえば、'video/3gpp') に変更すると、予期したとおりに動作し、エラーも発生しません。アップロードされているオブジェクトの実際のコンテンツは関係なく、エラーが発生するかどうかには関係ありません。
Delphi で Indy コードをたどりましたが、テキスト コンテンツ タイプで常にこのエラーが発生する理由がわかりません。
何か案は?