如何从TIdHTTPWebBrokerBridge中的请求接收二进制数据?

时间:2013-02-26 19:25:17

标签: delphi delphi-xe2 indy indy10 httpserver

我正在使用Indy使用HTTP构建客户端和服务器应用程序。在客户端上,我正在使用TIdHTTP并且在服务器上我使用TIdHTTPWebBrokerBridge和Web模块。我需要客户端能够通过Stream将任何类型的数据发布到服务器。这是通过我称为/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)?

1 个答案:

答案 0 :(得分:4)

使用TWebRequest.ReadClient()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;