Téléchargement Asynchrone avec TIndyHttp & TThread

Description

Je vous propose une classe que j'ai écrite il y a une semaine pour télécharger
des chaines, des fichiers grace à indy de maniere asynchrone grace au thread.
Je l'ai programmée parceque j'avais écris un programme en C# .NET qui utilise
beaucoup le téléchargement de page. .Net étant particulièrement garnis on pouvait
utiliser WebClient pour cette tache. Mais en Delphi, il me fallait contourner cette
contrainte et j'en avais besoin pour un projet Android.
Voici donc une classe que j'ai écrite.

elle se présente comme ceci :

  TAsyncDownloader = class(TThread)
  private
    FTagObject : TObject;
    FTagString : String;
    FTagInt : Integer;
    FOwnStream:boolean;

    FTarget : TStream;
    FUrl, FFileName : String;

    FPercent:byte;
    FState : TDownloadState;

    FDownloader : TIdHTTP;
    FProgress : TDownloadProgess;

    FStringComplete : TDownloadStringComplete;
    FDataComplete : TDownloadDataComplete;
    FFileComplete : TDownloadFileComplete;

    FDownloadProcedure : TDownloadProcedure;

    FType : TDownloadType;

    procedure HttpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    procedure DoProgress;
    procedure DoCompleteFile;
    procedure DoCompleteString;
    procedure DoCompleteData;
    procedure DoDownload;
  public
    constructor Create;overload;
    constructor Create(ADownloadProcedure:TDownloadProcedure);overload;
    destructor Free;
    procedure Execute;override;

    procedure DownloadData(AUrl:String);overload;
    procedure DownloadData(AUrl:String;ATarget:TStream);overload;
    procedure DownloadFile(AUrl, AFileName:String);overload;
    procedure DownloadString(AUrl:String);overload;

    procedure SetHeader;
    ///<summary>Event that will be triggered at in interval time to provide
    /// the percentage downloaded</summary>
    ///<para> use this event to uptade something like a gauge or a progress component</para>
    property OnProgress : TDownloadProgess read FProgress write FProgress;
    ///<summary>This event is triggered when the download is complete</summary>
    ///<para>Cast the Sender to TAsyncDownloader to retreave the properties needed</para>
    ///<para>like the Url or the Target Stream used to store the download</para>
    property OnDownloadStringComplete : TDownloadStringComplete read FStringComplete write FStringComplete;
    property OnDownloadDataComplete : TDownloadDataComplete read FDataComplete write FDataComplete;
    property OnDownloadFileComplete : TDownloadFileComplete read FFileComplete write FFileComplete;
    ///<summary>This is the IdHttp object used to perform the download</summary>
    property Downloader : TIdHTTP read FDownloader write FDownloader;
    ///<summary>Target where the download will be stored</summary>
    ///<para>This is a decendent of TStream</para>
    property Url : string read FUrl write FUrl;
    property State : TDownloadState read FState;

    property TagObject : TObject read FTagObject write FTagObject;
    property TagInt : Integer read FTagInt write FTagInt;
    property TagString : String read FTagString write FTagString;
  end;


les évenement que vous aurez assigné à OnProgress(qui fournira une indication
sur le pourcentage téléchargé), OnDownloadStringComplete,OnDownloadDataComplete
et OnDownloadFileComplete seront éxecuté via Synchronise, donc pas de souci pour
mettre à jour votre progressebar par exemple.

Enjoy.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.