2010-02-02 11 views

cevap

20

kullanıyorum, bu örneği kodlu ettik sadece bir HTTP GET, Indy 10 ile, çok Indy 9 ile çalışır umut:

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

Response.ContentLength değeri her zaman geçerli değildir. Özellikle, "yığın" aktarım kodlamasını kullanan HTTP 1.1 cevaplarında "İçerik Uzunluğu" başlığının kullanılmasına izin verilmez. Parçalanmış transferler sırasında, verilerin birden çok blok halinde aktarılmasından ve her bloğun kendi iç boyutuna sahip olduğundan, verilerin toplam büyüklüğü zamanın önünde bilinmemektedir. –

+1

Daha iyi? Şimdi "IdHTTP.pas" birimi – ulrichb

+2

içinde "TIdCustomHTTP.ReadResult()" ile aynı koşulları kullanın ve OnWork olayında Application.ProcessMessages(); 'yazmayı unutmayın! –