Как в Delphi скачать большой файл по ссылке (URL) с отображением прогресса?
У меня есть ссылка на скачивание 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 шт):
Автор решения: Kromster
→ Ссылка
Нашел достаточно удобный вариант:
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;