Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Saber si concluyó correctamente la descarga (https://www.clubdelphi.com/foros/showthread.php?t=37950)

lpedrazzi 27-11-2006 20:43:23

Saber si concluyó correctamente la descarga
 
Amigos, Buenas tardes alguien me sabe explicar si existe la posibilidad de enterarse si una descarga de archivo finaliza correctamente? estoy utilizando el componente Idhttp1 de las indy 9 de la siguiente manera

//Dónde contenido es un TMemoryStream

idHttp1.Get(Url, Contenido);
Contenido.SaveToFile('C:\archivo.zip');

desde ya muchas gracias.

Crandel 28-11-2006 00:22:23

La verdad es que nunca lo hice, pero se me ocurre que podrias comparar el tamaño del archivo a bajar con el que bajaste.

lpedrazzi 28-11-2006 15:46:41

Agradezco tu interés, te comento que en dicha instancia no tengo manera de conocer el tamaño del archivo a descargar. El programa que descarga el archivo es un autómata y descarga archivos de actualizaciones de una página web en determinados horarios sin intervención alguna del usuario.

dec 28-11-2006 16:39:54

Hola,

Se me ocurre que utilizes el evento "OnWorkEnd" del componente "TIdHttp". Dicho evento se disparará cuando se complete la descarga. En el mismo puedes comprobar el tamaño del archivo con el tamaño de la descarga. Lo primero puedes conseguirlo con el truco "Tamaño real de un archivo" que encuentras aquí mismo en el ClubDelphi. Lo segundo puedes conseguirlo echando un vistazo a la propiedad "IdHTTP.Response.ContentLength".

La cosa podría quedar más o menos así en el evento susomentado:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP: TIdHTTP;
    bProgresoDescarga: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
    procedure IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetSizeOfFile(const Filename:string): Int64;
var Sr:TSearchRec;
begin
  try
    if FindFirst(FileName,faAnyFile,sr) <> 0 then
      raise Exception.Create('Archivo ' + FileName+' no encontrado');
    Result:= sr.FindData.nFileSizeHigh * maxdword + sr.Finddata.nFileSizeLow;
  finally
    FindClose(sr);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create('C:\archivo.zip', fmCreate);
  try
    IdHTTP.Get('http://www.loturak.es/zip/loturak_0.9.zip', fs);
  finally
    fs.Free;
  end;
end;

procedure TForm1.IdHTTPWorkBegin(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  bProgresoDescarga.Max := IdHTTP.Response.ContentLength;
end;

procedure TForm1.IdHTTPWork(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  bProgresoDescarga.Position := AWorkCount;
end;

procedure TForm1.IdHTTPWorkEnd(Sender: TObject;
 AWorkMode: TWorkMode);
var
  tamanoArchivo: Int64;
  tamanoDescarga: Int64;
begin
  tamanoArchivo := GetSizeOfFile('C:\archivo.zip');
  tamanoDescarga := IdHTTP.Response.ContentLength;
  if (tamanoArchivo = tamanoDescarga) then
    ShowMessage('Descarga terminada con éxito')
  else
    ShowMessage('Hubo algún problema con la descarga');
end;

end.

El único problema que se me ocurre es que el Servidor no retorne el "ContentLength" del archivo. No es lo habitual, pero, puede suceder. Tendrías que hacer pruebas en tu caso. Es lo que se me ocurre a bote pronto.

lpedrazzi 28-11-2006 17:19:40

El IdHTTP.Response.ContentLength me devuelve el valor -1 sera porque el servidor no me retorna el tamaño?

dec 28-11-2006 17:21:43

Hola,

¿Te devuelve "-1" una vez comenzada/concluída la descarga? Entonces está claro: el Servidor no retorna el tamaño del archivo a descargar.


La franja horaria es GMT +2. Ahora son las 05:53:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi