В этой статья я расскажу Вам о том, как можно скачать файл несколькими способами из сети Интернет. Первый способ применять не стоит, потому, что он сильно много забирает оперативной памяти, если качать большие файлы, если не большие файлы с помощью этого метода скачивать, то работать будет нормально. Суть первого метода получается скачиваемый файл частями из Интернет в переменную памяти типа TMemoryStream. Вот с каждым объемом увеличения файла, и происходит большая загрузка оперативной памяти, вот поэтому данный метод при скачивании больших файлов применять не рекомендуется. Второй метод более лучший и качает файл с помощью модуля wininet.pas многим он знаком. Его стоит подключить в Uses и затем начать работать. Так вот вернемся к первому методу. Реализуется он не сложно. «Положим» на форму компоненты ТIdHTTP со вкладки Indy Clients ну и чтобы наша форма (окно программы) не так часто зависало при скачивании файла компонент TidAntiFreeze со вкладки Indy Misc .
Дальше на событие кнопки Onclick мы напишем следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
Stream:TMemoryStream;
begin
try
Stream:=TMemoryStream.Create;
IdHTTP1.Get('https://devdelphi.ru/files/adosql.rar',Stream);
Stream.SaveToFile('myfile.rar');
Stream.Free;
except
on e:Exception do
Stream.Free;
end;
end;
Как видите качает, но если откроем диспетчер задач, то посмотрим как в это время наша память грузится, поэтому этот метод предназначен для более мелких файлов закачек через сеть интернет. Да конечно можно в этот метод прикрутить ProgressBar, можно показывать сколько в текущий момент загружено байт, можно определить расширение файла, с которым нам качать и сохранять файл. Для начала определим расширение файла, чтобы знать, с каким сохранять файл делаем вот так:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream:TMemoryStream;
url,r:WideString;
i,j:integer;
begin
try
Stream:=TMemoryStream.Create;
url:='https://devdelphi.ru/files/adosql.rar';
for i:=1 to length(url) do
begin
if url[i]='.' then
begin
j:=i;
end;
end;
r:=copy(url,j+1,length(url));
IdHTTP1.Get(url,Stream);
Stream.SaveToFile('myfile.'+r);
Stream.Free;
except
on e:Exception do
Stream.Free;
end;
end;
Думаю понятно как определяется расширения файла, тут без комментариев, теперь прикрутить TProgressBar. Ставим данный компонент на форму. У TIdHttp есть такое событие как OnWorkBegin оно возникает, начинается посылка запроса GET или POST на это событие пишем следующее
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Max:=AWorkCountMax;
end;
Также на событие компонента TIdhttp - OnWork пишем следующее
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position:=ProgressBar1.Position+AWorkCount;
end;
Все вот и навели такую вот красоту в нашей проекте. Что касается второго методо, то он использует модуль wininet.pas, об этом говорилось раньше. Что касается этого метода, то тут есть отличные функции и процедуры с помощью которых мы и скачаем нужный нам файл. В следующей статье по скачки файлов из сети интернет мы и посмотрим даный второй метод.