0

我正在使用 Indy 使用 HTTP 构建客户端和服务器应用程序。在客户端上,我正在使用TIdHTTP,而在服务器上,我正在使用TIdHTTPWebBrokerBridgeWeb 模块。我需要客户端能够通过流将任何类型的数据发布到服务器。这是通过我调用的通用命令完成的,用于身份验证的 API 密钥/set?Key=API_KEY&Name=FILE_NAME在哪里,并且是正在发布的文件的名称。KeyName

在客户端,我发布的数据如下:

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后代发送的数据?我不需要知道如何保存或处理请求,我只需要知道如何从 Request( TWebRequest) 中获取这个 Stream?

4

1 回答 1

4

使用TWebRequest.ReadClient()orTWebClient.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 回答