2013-02-26 100 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

相關問題