В этой статья я расскажу Вам о том, как можно скачать файл несколькими способами из сети Интернет. Первый способ применять не стоит, потому, что он сильно много забирает оперативной памяти, если качать большие файлы, если не большие файлы с помощью этого метода скачивать, то работать будет нормально. Суть первого метода получается скачиваемый файл частями из Интернет в переменную памяти типа 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://zaokomtek.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://zaokomtek.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, об этом говорилось раньше. Что касается этого метода, то тут есть отличные функции и процедуры с помощью которых мы и скачаем нужный нам файл. В следующей статье по скачки файлов из сети интернет мы и посмотрим даный второй метод.
Кстати, хочу заметить, что сейчас очень популярно продавать свои какие-то товары или рекламировать услуги через объявления, а точнее через Интернет-объявления. В этом Вам могут помочь Бесплатные объявления Украины, через которые Вы без проблем можете продавать свои товары, предлагать свои услуги, а самое главное, что они бесплатны и все это можно сделать не выходя из дома. |
Исходники статьи качаем тут
Автор статьи - Andrey53
Похожие записи
Метки: get, idAntifreeze, Idhttp, Stream, закачка файлов
Хорошая статья, правда с русским языком есть нюансы но мы ведь не на уроке русского языка.
Автору Andrey53 + спасибо!
Для солидности используй… LastDelimiter
Спасибо!
Подскажите — как можно отловить событие что закачка завершена и закрыть форму?
у компонента TIdHTTP, есть событие WorkEnd, там и смотрите
не срабатывает.
запускаю форму
fmUpdate := TfmUpdate.Create(Application);
fmUpdate.Update;
fmUpdate.Showmodal;
fmUpdate.Free;
на форме
procedure TfmUpdate.IdHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
fmUpdate.close;
end;
так вот эта процедура отрабатывает раньше чем пробегате прогрессбар
Это событие работает правильно, просто Вы не так рассчитываете позицию TProgressBar
Возможно я что то не так сделал, но у меня такое впечатление что сначала файл скачивается, затем просто пробегает прогресс-бар.
да, скорее всего Вы не так сделали, что-то
ProgressBar1.Position:=ProgressBar1.Position+AWorkCount;-ошибка, надо вот так:ProgressBar1.Position:=AWorkCount;