Загрузка, приостановка и возобновление загрузки с использованием компонентов Indy - PullRequest
5 голосов
/ 03 июня 2010

На самом деле я использую компонент TIdHTTP для загрузки файла из Интернета. Мне интересно, если это возможно, приостановить и возобновить загрузку с помощью этого компонента или, возможно, другой компонент инди.

это мой текущий код, он работает нормально для загрузки файла (без резюме), но. Теперь я хочу приостановить загрузку, закрыть мое приложение, а после перезапуска приложения возобновить загрузку с последней сохраненной позиции.

var
  Http: TIdHTTP;
  MS  : TMemoryStream;
begin
  Result:= True;
  Http  := TIdHTTP.Create(nil);
  MS    := TMemoryStream.Create;
  try

    try
      Http.OnWork:= HttpWork;//this event give me the actual progress of the download process
      Http.Head(Url);
      FSize := Http.Response.ContentLength;
      AddLog('Downloading File '+GetURLFilename(Url)+' - '+FormatFloat('#,',FSize)+' Bytes');
      Http.Get(Url, MS);
      MS.SaveToFile(LocalFile);
    except
      on E : Exception do
      Begin
       Result:=False;
       AddLog(E.Message);
      end;
    end;
  finally
    Http.Free;
    MS.Free;
  end;
end;

Ответы [ 2 ]

5 голосов
/ 20 июля 2010

следующий код работал для меня. Скачивает файл по чанкам:

procedure Download(Url,LocalFile:String;
  WorkBegin:TWorkBeginEvent;Work:TWorkEvent;WorkEnd:TWorkEndEvent);
var
  Http: TIdHTTP;
  exit:Boolean;
  FLength,aRangeEnd:Integer;
begin
  Http  := TIdHTTP.Create(nil);
  fFileStream:=nil;
  try

    try
      Http.OnWork:= Work; 
      Http.OnWorkEnd := WorkEnd;

      Http.Head(Url);
      FLength := Http.Response.ContentLength;
      exit:=false;
      repeat

        if not FileExists(LocalFile) then begin
          fFileStream := TFileStream.Create(LocalFile, fmCreate);
        end
        else begin
          fFileStream := TFileStream.Create(LocalFile, fmOpenReadWrite);
          exit:= fFileStream.Size >= FLength;
          if not exit then
            fFileStream.Seek(Max(0, fFileStream.Size-4096), soFromBeginning);
        end;

        try
          aRangeEnd:=fFileStream.Size + 50000;

          if aRangeEnd < fLength then begin           
            Http.Request.Range := IntToStr(fFileStream.Position) + '-'+  IntToStr(aRangeEnd);
          end
          else begin
            Http.Request.Range := IntToStr(fFileStream.Position) + '-';
            exit:=true;
          end;

          Http.Get(Url, fFileStream);
        finally
          fFileStream.Free;
        end;
     until exit;
     Http.Disconnect;

    except
      on E : Exception do
      Begin
       //Result:=False;
       //AddLog(E.Message);
      end;
    end;
  finally
    Http.Free;
  end;
end;
1 голос
/ 03 июня 2010

Может быть, здесь поможет заголовок HTTP RANGE. Обратитесь к http://www.west -wind.com / Weblog / posts / 244.aspx для получения дополнительной информации о возобновлении загрузки по HTTP.

Также посмотрите здесь https://forums.embarcadero.com/message.jspa?messageID=219481 для обсуждения TIdHTTP на ту же тему.

...