2010-02-02 13 views

Odpowiedz

20

mam zakodowane tym przykładzie, stosując tylko jeden HTTP GET z Indy 10, nadzieję, że współpracuje z Indy 9 TOO:

uses 
    {...} IdHTTP, IdComponent; 

type 
    TFormMain = class(TForm) 
    {...} 
    private 
    {...} 
    procedure HttpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); 
    end; 
{...} 

procedure TFormMain.Button1Click(Sender: TObject); 
var 
    Http: TIdHTTP; 
    MS: TMemoryStream; 
begin 
    Http := TIdHTTP.Create(nil); 
    try 
    MS := TMemoryStream.Create; 
    try 
     Http.OnWork:= HttpWork; 

     Http.Get('http://live.sysinternals.com/ADExplorer.exe', MS); 
     MS.SaveToFile('C:\ADExplorer.exe'); 

    finally 
     MS.Free; 
    end; 
    finally 
    Http.Free; 
    end; 
end; 

procedure TFormMain.HttpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); 
var 
    Http: TIdHTTP; 
    ContentLength: Int64; 
    Percent: Integer; 
begin 
    Http := TIdHTTP(ASender); 
    ContentLength := Http.Response.ContentLength; 

    if (Pos('chunked', LowerCase(Http.Response.TransferEncoding)) = 0) and 
    (ContentLength > 0) then 
    begin 
    Percent := 100*AWorkCount div ContentLength; 

    MemoOutput.Lines.Add(IntToStr(Percent)); 
    end; 
end; 
+2

Wartość Response.ContentLength nie zawsze jest poprawny. W szczególności w odpowiedziach HTTP 1.1, które używają kodowania transferu "chunkowanego", nagłówek "Długość treści" nie może być użyty. W przypadku transferów złożonych całkowity rozmiar danych nie jest znany z wyprzedzeniem, ponieważ dane są przesyłane w wielu blokach, a każdy blok ma swój własny rozmiar wewnętrznie. –

+1

Lepiej? Teraz używam dokładnie tych samych warunków, co w 'TIdCustomHTTP.ReadResult()' wewnątrz jednostki 'IdHTTP.pas' – ulrichb

+2

i nie zapomnij napisać' Application.ProcessMessages(); 'w zdarzeniu OnWork! –