0

Indyを使用して、HTTPを使用してクライアントアプリケーションとサーバーアプリケーションの両方を構築しています。クライアントでは、WebモジュールでTIdHTTP使用しており、サーバーでは使用しています。TIdHTTPWebBrokerBridgeクライアントがストリームを介してサーバーに任意のタイプのデータを投稿できるようにする必要があります。これは、私が呼び出したユニバーサルコマンドを介して実行されます。/set?Key=API_KEY&Name=FILE_NAMEここKeyで、は認証用のAPIキーであり、Nameは投稿されるファイルの名前です。

クライアントでは、次のようにデータを投稿しています。

function TInnoCloudClient.SetData(const Name: String; AStream: TStream): Bool;
var
  U: String;
begin
  U:= FServerURL; //Base URL of Server
  if Copy(U, Length(U)-1, 1) <> '/' then
    U:= U + '/';
  U:= U + 'get?Key='+Encode(FAPIKey);
  U:= U + '&Name='+Encode(Name);
  try
    FWeb.Post(U, AStream);
  except
    on e: exception do begin
      //Handle Exception
    end;
  end;
end;

この関数は、内部のデータをファイル名が。AStreamのサーバー上のファイルに保存することになっていますName。ただし、サーバー側では、リクエストハンドラーに、TStreamこれを読み取ることができる対応するプロパティがリクエストに表示されません。

TStreamサーバーで、子孫として送信したデータを取得するにはどうすればよいですか?保存方法やリクエストの処理方法を知る必要はありません。リクエストからこのストリームを取得するにはどうすればよいですか(TWebRequest)?

4

1 に答える 1

4

TWebRequest.ReadClient()orメソッドを使用しTWebClient.ReadString()て投稿されたバイナリ データを読み取るか、TWebRequest.RawContentプロパティを使用して投稿されたデータを として取得しますAnsiString

このようなものが動作するはずです:

procedure TWebModule1.GetAllDataAsStream(ARequest: TWebRequest; AStream: TMemoryStream);
var
  BytesRead, ContentLength: Integer;
  Buffer: array[0..1023] of Byte;
begin
  AStream.Clear;
  ContentLength := ARequest.ContentLength;
  while ContentLength > 0 do begin
    BytesRead := ARequest.ReadClient(Buffer[0], Min(ContentLength, SizeOf(Buffer)));
    if BytesRead < 1 then Break;
    AStream.WriteBuffer(Buffer[0], BytesRead);
    Dec(ContentLength, BytesRead);
  end;
  AStream.Position:= 0;
end;
于 2013-02-26T20:10:15.573 に答える