2010-02-02 47 views

Respuesta

20

He codificado este ejemplo, utilizando un solo HTTP GET, con Indy 10, espero que funcione con Indy 9 también:

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

El valor Response.ContentLength no siempre es válida. En particular, en las respuestas HTTP 1.1 que usan la codificación de transferencia "fragmentada", no se permite el uso del encabezado "Content-Length". Durante las transferencias fragmentadas, el tamaño total de los datos no se conoce de antemano, ya que los datos se transmiten en múltiples bloques, y cada bloque tiene su propio tamaño internamente. –

+1

¿Mejor? Ahora uso exactamente las mismas condiciones que en 'TIdCustomHTTP.ReadResult()' dentro de la unidad 'IdHTTP.pas' – ulrichb

+2

y no olvides escribir' Application.ProcessMessages(); 'en el evento OnWork! –

Cuestiones relacionadas