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

Метки: , , , ,




К записи “Скачиваем файл из Интернет. Часть 1” оставлено комментариев: 10.

  1. Paskal:

    Хорошая статья, правда с русским языком есть нюансы но мы ведь не на уроке русского языка.
    Автору Andrey53 + спасибо!

  2. Владимир:

    Для солидности используй… LastDelimiter

  3. mrDuke:

    Подскажите — как можно отловить событие что закачка завершена и закрыть форму?

    • Andrey53:

      у компонента TIdHTTP, есть событие WorkEnd, там и смотрите

      • mrDuke:

        не срабатывает.
        запускаю форму
        fmUpdate := TfmUpdate.Create(Application);
        fmUpdate.Update;
        fmUpdate.Showmodal;
        fmUpdate.Free;

        на форме
        procedure TfmUpdate.IdHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
        begin
        fmUpdate.close;
        end;

        так вот эта процедура отрабатывает раньше чем пробегате прогрессбар

        • Andrey53:

          Это событие работает правильно, просто Вы не так рассчитываете позицию TProgressBar

          • mrDuke:

            Возможно я что то не так сделал, но у меня такое впечатление что сначала файл скачивается, затем просто пробегает прогресс-бар.

          • Andrey53:

            да, скорее всего Вы не так сделали, что-то

  4. Rush:

    ProgressBar1.Position:=ProgressBar1.Position+AWorkCount;-ошибка, надо вот так:ProgressBar1.Position:=AWorkCount;

Оставить комментарий на Paskal

Вы можете использовать следующие теги:

*