2013-02-26 99 views
0

我使用Indy使用HTTP构建客户端和服务器应用程序。在客户端上,我使用TIdHTTP,并且在我使用TIdHTTPWebBrokerBridge的服务器上安装了Web模块。我需要客户端能够通过流将任何类型的数据发布到服务器。这是通过我称为/set?Key=API_KEY&Name=FILE_NAME的通用命令完成的,其中Key是用于验证的API密钥,而Name是要发布的文件的名称。如何从TIdHTTPWebBrokerBridge中的请求接收二进制数据?

在客户端,我张贴的数据,像这样:

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文件名中的服务器上。然而,在服务器端,在请求处理程序中,我没有看到Request中的相应TStream属性,我可以从中读取它。

在服务器中,如何获取我作为TStream后代发送的数据?我不需要知道如何保存或处理请求,我该如何从请求中获取此流(TWebRequest)?

回答

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; 
+0

FYI:https://forums.embarcadero.com/thread.jspa?threadID=64307 – 2013-02-28 18:35:35

+0

从我在Delphi文档看见什么我自己的测试似乎要证明这个代码导致截断的内容 - 第一个48k(?)将会丢失。在调用'ReadClient'之前,需要读取'content',它只在'content'的前48k后检索缓冲区的其余部分。 – Vector 2016-01-29 21:24:19

+0

我不使用WebBroker,所以我不能说如果这是真的或不。我所知道的是'TIdHTTPWebBrokerBridge'在内部使用'TIdHTTPServer'并向WebBroker公开其功能。如果客户端发布数据,则直接从Indy的'TIdHTTPRequestInfo.PostStream'对象读取各种'TWebRequest.Read ...()'方法,否则它从包含来自'TIdHTTPRequestInfo.FormParams'和'TIdHTTPRequestInfo.UnparsedParams'的数据的'TStringStream'读取'。所以,如果以我上面显示的方式阅读缺少数据,则很可能在运行此代码之前已经阅读了它。 – 2016-01-30 00:40:07

相关问题