Скачиваем файл из Интернет. Часть 1

4 минуты на чтение

В этой статья я расскажу Вам о том, как можно скачать файл несколькими способами из сети Интернет. Первый способ применять не стоит, потому, что он сильно много забирает оперативной памяти, если качать большие файлы, если не большие файлы с помощью этого метода скачивать, то работать будет нормально. Суть первого метода получается скачиваемый файл частями из Интернет в переменную памяти типа 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, об этом говорилось раньше. Что касается этого метода, то тут есть отличные функции и процедуры с помощью которых мы и скачаем нужный нам файл. В следующей статье по скачки файлов из сети интернет мы и посмотрим даный второй метод.

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Как и обещал статья о загрузки файла из Интернет с помощью модуля wininet. Как мы скачивали файл с помощью TidHTTP можно посмотреть тут. Довольно мощная библиотека и много можно что с ней делать, но пока что остановимся на загрузке файлов из сети интернет с по...
Давайте в этой статье поговорим, как можно скачть файл из сети Интернет с помощью TidHTTP да и еще так, чтобы при этом наша форма не зависала и можно было во время скачивания выполнять какие-то другие функции программы, например набирать текст в TMemo. Для это...
Ну вот наконец-то я созрел для написании статьи, где я хочу рассказать о том, как можно скачать файл из Интернет без зависания формы, то есть с использованием потоков. Сказать честно, сам в потоках давно разбираюсь так до конца и не разобрался, но маленькую пр...