2012-06-30 37 views
2

我有一個Indy服務器,並在URL請求文件時發送一個文件是微不足道的,而且似乎總能正常工作。如何創建一個在Indy中創建文件下載工作的頁面?

但我也想設置一個類似如下的第二種情況:(這適用於動態生成的內容,所以要求一個靜態文件將無法正常工作)

http://example.com/getFile.html?filename=myImage.png

我使用的是定製的印客戶端,並呼籲TIdHTTP.Get檢索所有這些文件,並在第二個用例,似乎這個算法是繼:

Roll 1D4. If you rolled 2 or higher, download correctly. 
Otherwise, roll 1D6 against this table of Indy exceptions and 
raise one of them. 
If a random exception is raised, it MUST NOT be caught inside 
of Indy code. 

到目前爲止,常見的似乎是EIdHTTPProtocolExceptionEIdClosedSocketEIdNotConnected,但我也見過其他一些人。設置一個異常處理程序來捕獲這些異常,並重新嘗試下載工作,有時甚至會引發更多的異常,這些異常看起來是隨機的,沒有確定性原則。

事實上,這個從來沒有發生使用靜態下載用例告訴我,在第二個用例中可能會有一些奇怪的事情發生,我的代碼沒有正確計算。代碼真的很簡單。在客戶端:

procedure TdmConnection.GetFile(const URL: string; stream: TStream); 

    procedure Retry; 
    begin 
    sleep(100); 
    stream.Size := 0; //clear any aborted partial download 
    http.Get(URL, stream); 
    end; 

begin 
    try 
     http.Get(URL, stream); 
    except 
     on EIdClosedSocket do 
     Retry; 
     on EIdNotConnected do 
     Retry; 
     on EIdHTTPProtocolException do 
     Retry; 
    end; 
end; 

而在服務器端,請求運行產生該文件的腳本(正確;我驗證過的部分),並告訴印服務器,使其返回的HTTP響應。我試着簡單地打開一個TFileStream並將其分配給Response.ContentStream,並且我試着在Response對象上調用ServeFile方法,並且我最終還是在客戶端獲得了相同的錯誤。服務器代碼的相關部分如下所示:

if lServeFile <> '' then begin //variable set by the script 
    if lServeFile = '***' then 
     response.ResponseNo := 404 
    else begin 
     response.ResponseNo := 200; 
     response.ServeFile(AContext, lServeFile); 
    end; 
    end; 

任何有經驗的Indy用戶知道我在做什麼錯了?使用Delphi XE附帶的Indy 10庫存。

+0

我已經使用了ServeFile,但由於某種原因,我已經結束了使用WriteFile,不記得爲什麼,也許你可以嘗試嗎? – ComputerSaysNo

+0

您的客戶端代碼沒有問題。請顯示您的服務器代碼。 –

+0

@Remy:編輯添加服務器代碼。這真的很簡單。 –

回答

1

沒關係,問題不在Indy。經過進一步調試,我最終發現有兩個線程都使用了IdHTTP組件,有時他們同時使用它。保證每個線程都有自己的IdHTTP解決了這個問題。

+0

不要這麼快責怪indy,這個bug通常在你自己的代碼中。但不是總是[正如我在這裏指出的那樣](http://stackoverflow.com/a/4414918/407361) – MikeT

相關問題