Первая задача может решаться «в лоб» - записью в текстовый файл последовательности команд (тэгов) языка разметки HTML. Передачу же файлов для публикации в Интернете проще всего делать по протоколу передачи файлов FTP(File Transfer Protocol). Для работы по протоколу FTP предназначен компонент NMFTP TMLзыка разметки овый файл последовательности пьютера., находящийся на закладке FastNet палитры компонентов.
Для передачи файла на Web-сервер по протоколу FTP необходимо знать:
- имя пользователя (login);
- пароль;
- имя каталога на сервере, в который будет помещен файл.
Все эти сведения можно получить у Интернет-провайдера.
Научимся программно передавать файл в Интернет. Разместим на форме компонент с именем FTP типа NMFTP, а также поля ввода для логина, пароля и каталога и список отправляемых файлов (Рис. 31.1).
Рис. 35.1 Форма для отправки файлов.
Сначала зададим начальные установки: имя сервера, логин и пароль, и попробуем установить соединение:
WITH FTP DO
BEGIN
// имя сервера
Host:=Trim(LabeledEdit1.Text);
// логин
UserID:=Trim(LabeledEdit2.Text);
// пароль
Password:=Trim(LabeledEdit3.Text);
TRY
Connect
except
MessageDlg('Ошибка при соединении с сервером', mtError,[mbOK],0);
exit
end
end;
В случае успеха можно начинать передачу. Создадим для этого отдельную процедуру:
PROCEDURE FTPSendFile(fn:STRING; dir:STRING);
// fn – имя отправляемого файла
// dir – каталог на сервере
VAR i,deep:BYTE;
FUNCTION FTPChangeDir(VAR f:TNMFTP;s:STRING):BYTE;
VAR p:BYTE;
cur:STRING;
BEGIN
Result:=1;
WHILE (s<>'') DO
BEGIN
p:=POS('\',s);
IF p>0 THEN
BEGIN
INC(Result);
cur:=COPY(s,1,p-1);
s:=COPY(s,p+1,LENGTH(s))
END
ELSE
BEGIN
cur:=s;
s:=''
END;
f.ChangeDir(cur);
END
END;
BEGIN
TRY
WITH form1.FTP DO
BEGIN
deep:=FTPChangeDir(form1.FTP,Trim(dir));
Upload(Trim(fn),ExtractFileName(Trim(fn)));
FOR i:=1 TO deep DO
ChangeDir('..')
END
EXCEPT
MessageDlg('Ошибка при передаче файла', mtError,[mbOK],0)
END
END;
Основной метод, обеспечивающий собственно передачу файла – Upload(локальное_имя_файла, имя_файла_на_сервере). Например:
FTP.Upload(‘C:\1.htm’,’1.htm’)
Так как в подавляющем большинстве случаев имя файла на сервере совпадает с локальным (нечего создавать лишнюю путаницу), то в рассматриваемом примере этот метод вызывается следующим образом:
Upload(Trim(fn),ExtractFileName(Trim(fn)));
А в какой каталог на сервере попадет файл? Для смены текущего каталога, в который записываются файлы, предназначен метод ChangeDir(имя_каталога). У него есть одна неприятная особенность: смена каталогов может производиться только пошагово, по одному каталогу за шаг. Например, чтобы перейти в каталог public_html/win/main, необходимо вызвать метод ChangeDir трижды:
FTP. ChangeDir(‘public_html’);
FTP. ChangeDir(‘win’);
FTP. ChangeDir(‘main’);
После выполнения данного метода указанный каталог остается текущим. Чтобы не запутаться при передаче файла в произвольный каталог, в программе использована функция
FTPChangeDir(VAR f:TNMFTP;s:STRING):BYTE;
На вход ей подается ссылка на компонент типа NMFTP и текстовая строка – имя каталога (вида public_html/win/main), а возвращает она число потребовавшихся вызовов метода ChangeDir. В функции переданная текстовая строка разделяется по символам-разделителям “\” и для каждого выделенного названия каталога выполняется метод ChangeDir. Возвращаемое же значение запоминается в переменную deep. Зачем? Чтобы при передаче следующего файла снова оказаться в исходной точке – корневом каталоге сервера. Для этого надо выполнить команду «перейди в каталог более высокого уровня» столько раз, сколько раз был выполнен метод ChangeDir. Для этого используется цикл: