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;
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. –
Daha iyi? Şimdi "IdHTTP.pas" birimi – ulrichb
içinde "TIdCustomHTTP.ReadResult()" ile aynı koşulları kullanın ve OnWork olayında Application.ProcessMessages(); 'yazmayı unutmayın! –