我有一個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.
到目前爲止,常見的似乎是EIdHTTPProtocolException
,EIdClosedSocket
和EIdNotConnected
,但我也見過其他一些人。設置一個異常處理程序來捕獲這些異常,並重新嘗試下載工作,有時甚至會引發更多的異常,這些異常看起來是隨機的,沒有確定性原則。
事實上,這個從來沒有發生使用靜態下載用例告訴我,在第二個用例中可能會有一些奇怪的事情發生,我的代碼沒有正確計算。代碼真的很簡單。在客戶端:
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庫存。
我已經使用了ServeFile,但由於某種原因,我已經結束了使用WriteFile,不記得爲什麼,也許你可以嘗試嗎? – ComputerSaysNo
您的客戶端代碼沒有問題。請顯示您的服務器代碼。 –
@Remy:編輯添加服務器代碼。這真的很簡單。 –