Как в Delphi скачать большой файл по ссылке (URL) с отображением прогресса?

Рейтинг: -1Ответов: 1Опубликовано: 03.04.2023

У меня есть ссылка на скачивание zip файла, например:

https://someserver.com/api/1.0/download?file=somearchive.zip&client=kp

Сейчас я могу его скачать с минимумом проблем через

uses REST.Client

TDownloadURL.DownloadRawBytes(url, stream);

Однако, файл архива может быть достаточно большим (100мб+) и мне бы хотелось отображения прогресса его скачивания. Каким методом библиотеки REST (или другой, входящей в Delphi XE8+ по умолчанию) можно скачивать файлы с индикацией прогресса?

Ответы

▲ 1Принят

Нашел достаточно удобный вариант:

uses WinInet

procedure FileGet(const aUrl: string; aStream: TStream; aOnProgress: TProc);
const
  // Read in chunks of 2mb
  BUFFER_SIZE = 2 * 1024 * 1024;
var
  hSession, hURL: HINTERNET;
  buffer: array of Byte;
  bytesRead: Cardinal;
begin
  // Works good, but has no OnProgress event
  //TDownloadURL.DownloadRawBytes(aUrl, aStream);

  SetLength(buffer, BUFFER_SIZE);

  hSession := InternetOpen(PChar(fClientName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(aUrl), nil, 0, 0, 0);
    try
      repeat
        InternetReadFile(hURL, @buffer[0], Length(buffer), bytesRead);
        aStream.Write(buffer[0], bytesRead);

        // Signal we've got progress
        aOnProgress;
      until bytesRead = 0;
    finally
      InternetCloseHandle(hURL);
    end;
  finally
    InternetCloseHandle(hSession);
  end;

  aStream.Position := 0;
end;