6

次の 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 コードをたどりましたが、テキスト コンテンツ タイプで常にこのエラーが発生する理由がわかりません。

何か案は?

4

2 に答える 2

4

「; charset=ISO-8859-1」を Content-Type 文字列に追加すると、次のように機能します。

Headers.Values['Content-type']:='text/plain; charset=ISO-8859-1';

コードをステップ実行すると、TIdHTTPProtocol.BuildAndSendRequest (IdHTTP.pas) から呼び出される TIdEntityHeaderInfo.SetHeaders (IdHTTPHeaderInfo.pas) で Content-Type が変更されていることがわかります。

最終的に、問題は TIdEntityHeaderInfo.SetContentType (IdHTTPHeaderInfo.pas) が「テキスト」であり、まだコンテンツ タイプがない場合にコンテンツ タイプに文字セットを追加していることにあるようです。コンテンツ タイプは署名される文字列の一部であるため、このような状況ではコンテンツ タイプを変更しないでください。署名後に変更すると署名が無効になります。

于 2012-04-26T14:33:33.903 に答える
0

私はまったく同じ問題を抱えていました。また、コンテンツ タイプとして application/octet-stream を使用しましたが、まだ問題がありました。後で、バケット名は小文字でなければならないことを発見しました (米国標準地域では、Amazon は大文字または大文字小文字混合の名前でバケットを定義することを許可していますが、これらのバケットは HTTP API (TAmazonStorageService を含む) を介してアクセスすることはできません)。 not found メッセージ, まだ 403 エラー (認証されていないユーザー). ただし、名前をすべて小文字に変更したところ、問題なく動作しました. お役に立てば幸いです.

于 2014-11-03T20:25:04.750 に答える