| Использование протокола FTP
Передача файлов с одного компьютера на другой — обычное явление в Internet. Если необходимо, чтобы ваш партнер, который находится на значительном расстоянии от вас, получил некоторый файл, это не составит проблем. Этот процесс займет всего несколько секунд.
Файл можно переслать, используя Web-сервер или протокол FTP. Способ передачи файлов с помощью Web-сервера описывался ранее в разделе "Другие виды Web-приложений". В этом разделе речь пойдет о протоколе FTP.
Протокол FTP не зависит от Web. Это значит, что передачу файла можно осуществить в сценарии, написанном на РНР для Web, или в любом другом сценарии. Протокол FTP позволяет получить содержимое каталога на удаленном компьютере и передать в том или ином направлении один или несколько файлов.
Протокол FTP основан на архитектуре клиент/сервер, т.е. для передачи файлов между вашим и удаленным компьютером необходимо сначала подключиться к серверу FTP, а потом передать запрос.
Язык РНР позволяет обмениваться файлами с помощью протокола FTP. В случае использования операционной системы Windows поддержка FTP включена по умолчанию. При установке РНР в операционных системах Unix/Linux/Mac следует воспользоваться параметром
--enable-ftp
Подключение к серверу FTPДля подключения к компьютеру, на котором установлен сервер FTP и с которым будет осуществляться обмен файлами, предназначена функция ftp_connect().
$connect = ftp_connect("janet.valade.com") ; В качестве аргумента этой функции можно также использовать IР-адрес сервера FTP. $connect = ftp_connect("172.17.204.2"); После установки соединения с сервером FTP на нем необходимо зарегистрироваться. Для этого потребуется ввести идентификатор пользователя и пароль. При этом можно воспользоваться своими персональными данными либо же использовать общий для всех идентификатор и пароль. Многие Web-узлы именно так и поступают, предоставляя в качестве идентификатора пользователя значение anonymous, а в качестве пароля — адрес электронной почты. В общем случае данные пользователя следует хранить в отдельном файле и подключать его по мере необходимости.
Для регистрации на сервере FTP в языке РНР предусмотрена функция ftp_login(). При этом предполагается, что у пользователя имеются соответствующие идентификатор и пароль.
$login_result = ftp_login($connect, $userid, $passwd); Если же соединение с сервером FTP не было установлено предварительно, будет выведено следующее предупреждающее сообщение:
Warning: ftp_login() expects parameter 1 to be resource, boolean given in d:\test1\test13.php on line 9
Однако следует заметить, что сценарий РНР в данном случае не остановится и будет продолжать выполняться. Скорее всего, это не то, что вам нужно, поскольку последующий код может использовать соединение FTP. Во избежании данной проблемы можно воспользоваться следующей конструкцией:
$connect = ftp_connect("janet.valade.com") or die("He удалось подключиться к серверу"); $login_result = ftp_login($connect,$userid,$passwd) or die("He удалось зарегистрироваться на сервере");
Функция die() позволяет остановить выполнение сценария в случае наличия ошибки. После регистрации на сервере FTP ему можно передавать запросы различного вида, например на получение содержимого каталога или загрузку файлов. Все эти возможности рассматриваются в следующих разделах.
Получение содержимого каталога
При использовании протокола FTP одной из основных задач является получение содержимого каталога. Для этого в РНР предусмотрена функция ftp_nlist(), которая возвращает массив имен файлов. Ее синтаксис имеет такой вид:
$filesArr = ftp_nlist($connect, "data"); Второй параметр функции ftp_nlist() служит для указания имени каталога. Если же оно неизвестно, можно получить список файлов текущего каталога:
$directory_name = ftp_pwd($connect); $filesArr = ftp_nlist($connect, $directory_name);
Для отображения всех файлов каталога можно воспользоваться следующим фрагментом кода: foreach($filesArr as $value) { echo $value\n; }
Передача файлов с помощью протокола FTPДля получения файла с удаленного компьютера с помощью протокола FTP в РНР предназначена функция ftp_get(). Ее синтаксис имеет следующий вид:
ftp_get($connect, "newfile.txt", "data.txt", FTP_ASCII); Аргумент newfile.txt соответствует имени файла, которое он будет иметь после загрузки на пользовательский компьютер, a data.txt — имя существующего файла, находящегося на сервере FTP.
Четвертый параметр означает тип загружаемого файла: FTP_ASCII (файл в формате ASCII) или FTP_BINARY (двоичный файл). Чтобы определить тип файла, достаточно проанализировать его содержимое. Если он состоит из читаемых символов, то это файл в формате ASCII, в противном случае он является двоичным. Например, двоичными являются графические файлы.
Для загрузки файла с пользовательского компьютера на удаленный узел в языке РНР предназначена функция ftp_put(). Ее синтаксис имеет следующий вид:
ftp_put($connect, "newfile.txt", "data.txt", FTP_ASCII); Параметр newfile.txt соответствует имени файла, которое он будет иметь после загрузки на удаленный компьютер, adata.txt определяет имя существующего файла, который необходимо отправить на сервер FTP.
После завершения работы с соединением FTP его можно закрыть с помощью функции ftp_close():
ftp_close($connect); В качестве примера рассмотрим приведенный в листинге А сценарий РНР, который позволяет получить из заданного каталога все файлы с расширением .txt. Передача файлов осуществляется с использованием протокола FTP.
Листинг А. Сценарий, позволяющий загружать файлы с использованием протокола FTP ‹?php /* Имя сценария: downloadFiles * Описание: загружает все файлы каталога * с расширением .txt */ $dir_name = "data/"; $connect = ftp_connect("janet.valade.com") or die("He удалось подключиться к FTP-серверу"); $login_result = ftp_login($connect, $userID, $passwd) or die("He удалось зарегистрироваться на FTP-сервере"); $filesArr = ftp_nlist($connect,$dir_name); foreach($filesArr as $value) { if(ereg("\.txt$'\ $value)) { if(!file_exists($value)) { ftp_get($connect, $value, $dir_name.$value, FTP_ASCII); } else { echo "Файл $value уже существует!\n"; } } } ftp_close($connect); ?›
|
В данном сценарии сначала происходит получение списка файлов из каталога на удаленном компьютере, который сохраняется в массиве $filesArr. Цикл foreach используется для прохода по всем элементам этого массива и проверки, имеет ли файл расширение .txt. Если это так, сценарий проверяет, существует ли файл с указанным именем. Если файл уже был загружен с сервера, выводится соответствующее сообщение, в противном случае файл передается на компьютер пользователя.
Другие функции для работы с протоколом FTP
В РНР имеются и другие функции для работы с протоколом FTP, которые позволяют, например, перейти к другому каталогу на удаленном компьютере или создать новый каталог. Некоторые из них приведены в таблице ниже.
Функция | Описание | ftp_connect("имя_сервера") | Инициирует подключение к компьютеру. В качестве параметра шя_сервера можно использовать доменное имя или IP-адрес
| ftp_delete($connect, "путь/имя_файла") | Удаляет файл на удаленном компьютере | ftp_exec($connect, "команда") | Выполняет системную команду на удаленном компьютере | ftp_fget($connect, $fh, "data.txt", FTP_ASCII)
| Загружает содержимое файла, находящегося на удаленном компьютере, в открытый файл с дескриптором $fh
| ftp_fput($connect, "new.txt", $fh, FTP_ASCII)
| Загружает содержимое открытого на стороне пользователя файла с дескриптором $fh на сервер FTP
| ftp_get($connect, "d.txt", "sr.txt", FTP_ASCII) | Загружает файл, находящийся на удаленном компьютере, sr.txt — это имя файла, загружаемого с сервера; d.txt — имя результирующего файла на компьютере пользователя
| ftp_login($connect, $userID, $password)
| Обеспечивает регистрацию на сервере FP | ftp_mdtm($connect, "filename.txt") | Возвращает время последнего изменения файла | ftp_mkdir($connect, "имя_каталога")
| Создает новый каталог на удаленном компьютере | ftp_nlist($connect, "имя_каталога")
| Возвращает массив, элементами которого являются имена файлов, находящихся в удаленном каталоге
| ftp_put($connect, "d.txt", "sr.txt", FTP_ASCII)
| Загружает файл на удаленный компьютер, sr.txt — имя загружаемого файла; d.txt — имя файла после загрузки на удаленный компьютер
| ftp_pwd($connect) | Возвращает имя текущего каталога на удаленном компьютере
| ftp_rename($connect, "старое_имя", "новое_имя")
| Переименовывает файл, находящийся на удаленном компьютере
| ftp_rmdir($connect, "имя_каталога") | Удаляет каталог, находящийся на удаленном компьютере | ftp_size($connect, "filename.txt") | Определяет размер файла, находящегося на удаленном компьютере
| ftp_systype($connect) | Возвращает тип операционной системы, используемой файловым сервером, например Unix |
| |