Лекция: Программа получения файлов по HTTP и FTP протоколам
1.Разместите на форме три компонента Метка (Label1, Label2, Label3).
2.Измените свойство первой метки Caption на «Адрес файла: ». Для второй метки свойство Caption измените на «Сохранить файл в: ». Для третьей метке очистите значение Caption, здесь будут выдаваться сообщения по ходу загрузки.
3.Добавьте два компонента Edit1 и Edit 2. Первый разместите напротив первой метки справа (это будет для ввода адреса), второй — напротив второй метки справа. У обоих сотрите текст в свойствах Text.
4.Разместите на форме две кнопки (Button1, Button2), для первой в свойстве Caption введите слово «Загрузить файл», для второй — «Закрыть».
5.Откройте закладку Internet (для Delphi 4) или FastNet (для Delphi 5) палитры компонентов. Поместите на форму компоненты NMFTP и NMHTTP.
6.Для кнопки Button2 в окне инспектора объектов для события OnClick напишите следующую процедуру:
procedure TForm1.Button2Click(Sender: TObject);
begin
NMFTP1.Disconnect; // разрыв связи по FTP, если она установлена
NMHTTP1.Disconnect; // разрыв связи по HTTP, если она установлена
Close; // Закрываем программу
end;
7. Для события OnChange компонента Edit1 для проверки заполнения всех полей напишите следующую процедуру:
procedure TForm1.Edit1Change(Sender: TObject) ;
begin
Edit1.Tag := 1; // присвоить тагу Edit1 значение 1
end;
Аналогичную операцию необходимо проделать и для Edit2.
8. Для кнопки Button2 создайте обработчик события OnClick:
procedure TForm1.Button1Click(Sender: TObject) ;
begin
Label3.Caption := ''; // очиcтка метки для сообщений
if ( Edit1.Tag = 1 ) and ( Edit2.Tag = 1 ) and ( Edit1.Text <> '' )
and ( Edit2.Text <> '' ) then // проверка данных
begin
// данные введены, выполнять действия
end
else Label3.Caption := 'Введите все данные!' // введены не все данные
end;
9. Для проверки типа протокола необходимо из оригинального адреса определить начальные буквы адреса (FTP или HTTP):
procedure TForm1.Button1Click(Sender: TObject);
var
serv, addr, host, dir: String;
begin
Label3.Caption := ''; // очищаем метку для сообщений
if (Edit1.Tag =1) and (Edit2.Tag =1) and (Edit1.Text <> '' )
and ( Edit2.Text <> '' ) then // проверка данных
begin // данные введены, выполнять действия
addr := Edit1.Text; // сохраняем адрес в переменную
serv := Copy( addr, 1, 6 );//копируем 6 символов из
// адреса в переменную serv
if serv = 'ftp://' then // впереди ftp://
begin
// загрузка по FTP
end
else
if serv = 'http:/' then // впереди http:/
begin
// загрузка по HTTP
end
else Label3.Caption := 'Неправильный адрес' ;
end else Label3.Caption:='Не все данные'//не все данные
end;
10. При получении данных по выбранному протоколу необходимо сначала соединиться с хостом (сервером), а уже потом записывать файл. Для этого нужно разбить адрес на хост и собственно адрес файла:
procedure TForm1.Button1Click(Sender: TObject) ;
begin
Label3.Caption := ''; // очищаем метку для сообщений
if (Edit1.Tag = 1) and (Edit2.Tag =1) and ( Edit1.Text <> '' )
and ( Edit2.Text <> '' ) then // проверка данных
begin // данные введены, выполнять действия
addr := Edit1.Text; // сохраняем адрес в переменную
serv := Copy( addr, 1, 6 ); // копируем 6 символов из
// адреса в переменную serv
if serv = 'ftp://' then // впереди ftp://
begin
Delete( addr, 1, 6 ); // удаляем первые 6 символов из
//адреса
host := Copy ( addr, 1, ( Pos( '/', addr ) — 1 ) ) ;
// находим хост
Delete( addr, 1, ( Pos( '/', addr ) — 1 ) ) ;
dir := addr ;
// находим путь к файлу
// загрузка по FTP
end
else
if serv = 'http:/' then // впереди http:/
begin
// загрузка по HTTP
…
11. Дополните процедуру для записи файла по FTP протоколу вместо строки
«// загрузка по FTP»:
Edit1.Enabled := false; // выключение кнопки Edit1
Edit2.Enabled := false; // выключение кнопки Edit2
Button1.Enabled := false; // выключение кнопки Button1
NMFTP1.Host := host ;
NMFTP1.UserID := 'anonymous' ;
NMFTP1.Password := '' ;
Label3.Caption := 'Подключаемся… ' ;
NMFTP1.Connect ;
NMFTP1.Mode( MODE_IMAGE ) ;
Label3.Caption := 'Запись файла ...' ;
NMFTP1.Download( dir, Edit2.Text ) ;
Label3.Caption := 'Запись произведена успешно' ;
Label3.Caption := 'Отключение' ;
NMFTP1.Disconnect;
Button1.Enabled := true; // включение кнопки Button1
Edit1.Enabled := true ;
Edit2.Enabled := true; // включение Edit1, Edit2
Edit1.Clear ;
Edit2.Clear ;
12. Добавьте несколько комментариев:
Выделите компонент NMFTF1 у себя на форме, затем для события OnConnect введите:
procedure TForm1.NMFTP1Connect(Sender: TObject);
begin
Label3.Caption := 'Подключено успешно!!!' ;
end;
Данная процедура в случае успешного соединения выдаст в метку сообщение.
Для события OnConnectionFailed:
Procedure TForm1.NMFTP1ConnectionFailed(Sender: TObject);
begin
Label3.Caption := 'Ошибка!!! Не могу соединиться!' ;
end;
13. Для записи файлов по HTTP протоколу вместо строки «// загрузка по HTTP» введите следующий код:
Edit1.Enabled := false;
Edit2.Enabled := false ;
Button1.Enabled := false ;
Label3.Caption := 'Подключаемся… ' ;
Delete(addr, 1, 7);
NMHTTP1.InputFileMode := true ;
NMHTTP1.Body := Edit2.Text ;
NMHTTP1.Get( addr ); // загрузка
Button1.Enabled := true ;
Edit1.Enabled := true ;
Edit2.Enabled := true ;
Edit1.Clear ;
Edit2.Clear ;
14. Процесс получения данных необходимо оснастить индикатором загрузки. Для этого разместите на форме компонент ProgressBar. Выделите компонент NMFTP1 и откройте в Object Inspector закладку Events. Для события OnPacketRcvd создайте обработчик:
procedure TForm1.NMFTP1PacketRecvd(Sender: TObject);
begin
ProgressBar1.Position := Round(NMFTP1.BytesRecvd* 100/NMFTP1.BytesTotal) ;
Label3.Caption:='Получено'+IntToStr(NMFTP1.BytesRecvd) + ' байт из ' + IntToStr (NMFTP1.BytesTotal ) ;
end;
Все эти действия необходимо повторить и для NMHTTP1, только NMFTP1 в коде замените на NMHTTP1.
15. После завершения загрузки очистите ProgressBar — для этого в конце FTP и HTTP фрагментов допишите следующую строку:
ProgressBar1.Position := 0; // очищаем прогресс-бар