Télécharger le fichier progressivement en utilisant TIdHttp

Je veux implémenter un simple http downloader aide TIdHttp (Indy10). J'ai trouvé deux exemples de code à partir de l'internet. Malheureusement aucun d'eux ne me satisfait à 100%. Voici le code et je veux quelques conseils.


Variante 1

var
  Buffer: TFileStream;
  HttpClient: TIdHttp;
begin
  Buffer := TFileStream.Create('somefile.exe', fmCreate or fmShareDenyWrite);
  try
    HttpClient := TIdHttp.Create(nil);
    try
      HttpClient.Get('http://somewhere.com/somefile.exe', Buffer); // wait until it is done
    finally
      HttpClient.Free;
    end;
  finally
    Buffer.Free;
  end;
end;

Le code est compact et très facile à comprendre. Le problème est qu'il alloue de l'espace disque lorsque le téléchargement commence. Un autre problème est que nous ne pouvons pas afficher la progression du téléchargement dans l'interface utilisateur directement, sauf si le code est exécuté dans un thread d'arrière-plan (sinon, nous pouvons lier HttpClient.OnWork événement).


Variante 2:

const
  RECV_BUFFER_SIZE = 32768;
var
  HttpClient: TIdHttp;
  FileSize: Int64;
  Buffer: TMemoryStream;
begin
  HttpClient := TIdHttp.Create(nil);
  try
    HttpClient.Head('http://somewhere.com/somefile.exe');
    FileSize := HttpClient.Response.ContentLength;

    Buffer := TMemoryStream.Create;
    try
      while Buffer.Size < FileSize do
      begin
        HttpClient.Request.ContentRangeStart := Buffer.Size;
        if Buffer.Size + RECV_BUFFER_SIZE < FileSize then
          HttpClient.Request.ContentRangeEnd := Buffer.Size + RECV_BUFFER_SIZE - 1
        else
          HttpClient.Request.ContentRangeEnd := FileSize;

        HttpClient.Get(HttpClient.URL.URI, Buffer); // wait until it is done
        Buffer.SaveToFile('somefile.exe');
      end;
    finally
      Buffer.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;

Nous avons d'abord interroger la taille de fichier du serveur, puis nous télécharger le contenu du fichier en morceaux. (Extrait le contenu du fichier sera enregistré sur le disque lorsqu'ils sont reçus correctement. Le problème potentiel est que nous avons à envoyer plusieurs demandes pour le serveur. Je ne sais pas si certains serveurs (megaupload) peut limiter le nombre de demandes dans un délai de période de temps donnée.


Mes attentes

  1. L'utilisateur doit envoyer un seul GET-demande au serveur.
  2. L'espace disque ne doit pas être attribuée lorsque le téléchargement commence.

Tous les conseils sont appréciés.