Как и обещал статья о загрузки файла из Интернет с помощью модуля wininet. Как мы скачивали файл с помощью TidHTTP можно посмотреть тут. Довольно мощная библиотека и много можно что с ней делать, но пока что остановимся на загрузке файлов из сети интернет с помощью этой библиотеки. Думаю все таки через wininet легче, надежнее и быстрее скачивать файл из сети Интернет. Скачивывание файлов через wininet довольно легко запихнуть это все дело в поток, а в TIdHTTP компонент — TIdAntiFreeze не сильно-то и помогает, форма все равно зависает при скачивании файла, или отправки сообщений, запросов и так далее. В данном модули есть отличные процедуры и функции, для открытия интернет соединения, сессий и много другое, что значительно упрощает работу. Ну что давайте уже наконец-то приступим, что нам понадобится. Да почти что и ничего, только на форму установим компонент TButton и подключим в Uses — модуль wininet. Скомпилируем наш проект и убедимся, что модуль написан верно и программа скомпилировалось без ошибок. Предварительную «настройку» мы сделали, теперь приступим непосдрественно к написанию кода.
Все, что мы сейчас напишем, можно организовать в дальнейшем в виде функции, также вынести в модуль, сделать поток и использовать ее в своих проектах, но мы пока что остановимся лишь на просто скачивании файла, без организаций всяких функций и так далее. На событие TButton - OnClick пишем следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
ArrayLen:array[1..1024] of byte;
Len:DWORD;
F:File;
session,url:HInternet;
begin
try
session:=InternetOpen(Pchar(ExtractFileName(Application.ExeName)),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
url:=InternetOpenUrl(session,'https://devdelphi.ru/files/Ado.rar',nil,0,0,0);
AssignFile(F,'C:\1.rar');
Rewrite(F,1);
repeat
InternetReadFile(url,@ArrayLen,SizeOf(ArrayLen),Len);
BlockWrite(F,ArrayLen,Len);
until
Len=0;
CloseFile(F);
InternetCloseHandle(session);
except
on e:Exception do
end;
end;
Как видите у нас есть 2 переменные типа HInternet, которые открывают сессию и url, с которого мы будем качать. Также у нас есть байтовый массив, который определяет какими блоками мы будем качать, описана переменная типа DWORD, которая определяет сколько мы за одно обращение к нашему url скачиваем байт файла. Кроме этого мы описали переменную нетипизированного файла, в которую будем записывать байты, сколько скачали, столько и записали. В wininet есть замечательная функция InternetReadFile, которая позволяет считывать побайтно из интернета, а затем мы в наш нетипизированный файл записываем эти байты, естественно это все дело происходит в цикле пока наше количество считываемых байт из Интернета не будет равно 0. Как видите ничего сложного нету. Единственное, мне этот способ как-то больше нравится, от предложенного мно. с помощью TidHTTP, на днях попробую его сделать в потоке и посмотреть как будет происходить скачивание.
Функцией — InternetOpenUrl мы открываем, скачиваемый нами файл из Интернет. Функцией — InternetCloseHandle(session); — мы закрываем наше Интернет соединение. Для определения имени нашего файла напишем следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
ArrayLen:array[1..1024] of byte;
Len:DWORD;
F:File;
session,url:HInternet;
save_file:String;
i,j:integer;
begin
try
session:=InternetOpen(Pchar(ExtractFileName(Application.ExeName)),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
save_file:='https://devdelphi.ru/files/Ado.rar';
url:=InternetOpenUrl(session,PAnsiChar(save_file),nil,0,0,0);
for i:=1 to length(save_file) do
begin
if save_file[i]='/' then
j:=i;
end;
Delete(save_file,1,j);
AssignFile(F,'C:\'+save_file);
Rewrite(F,1);
repeat
InternetReadFile(url,@ArrayLen,SizeOf(ArrayLen),Len);
BlockWrite(F,ArrayLen,Len);
until
Len=0;
CloseFile(F);
InternetCloseHandle(session);
except
on e:Exception do
end;
end;