Получение и размещение файлов с помощью FTP

Задача
Необходимо переправить файлы с помощью FTP.

Решение
Для этого применяются встроенные FTP-функции PHP:

$c = ftp_connect('ftp.example.com') or die("Can't connect");
ftp_login($c, $username, $password) or die("Can't login");
ftp_put($c, $remote, $local, FTP_ASCII) or die("Can't transfer");
ftp_close($c); or die("Can't close");

Можно также использовать расширение cURL:

$c = curl_init("ftp://$username:$password@ftp.example.com/$remote");
// переменная $local – это местоположение сохраняемого файла
// на локальной машине
$fh = fopen($local, 'w') or die($php_errormsg);
curl_setopt($c, CURLOPT_FILE, $fh);
curl_exec($c);
curl_close($c);

Обсуждение
FTP (File Transfer Protocol) означает протокол передачи файлов и представляет собой способ обмена файлами между двумя компьютерами. В отличие от HTTP-серверов, FTP-сервер легко установить как для отправки файлов, так и для их получения.

Работа с встроенными FTP-функциями не требует дополнительных библиотек, но необходимо предварительно разрешить применение самих этих функций с помощью параметра --enable-ftp.


Эти функции разработаны специально для FTP, поэтому передача файлов с их помощью организуется без труда.

Все транзакции FTP начинаются с того, что ваш компьютер (локальный клиент), устанавливает соединение с другим компьютером (удаленным сервером):

$c = ftp_connect('ftp.example.com') or die("Can't connect");

После того как соединение установлено, необходимо послать на сервер имя пользователя и пароль, тогда удаленный сервер сможет идентифицировать вас и разрешить (или не разрешить) вам войти:

ftp_login($c, $username, $password) or die("Can't login");

Некоторые FTP-серверы поддерживают возможность, известную как анонимный доступ FTP. При анонимном доступе FTP пользователь может войти, не имея персональной учетной записи на удаленном сервере. В случае выбора анонимного доступа ваше имя пользователя
должно быть определено как anonymous, а паролем служит ваш адрес электронной почты.
Ниже показано, как передать файлы с помощью функций ftp_put()и ftp_get():

ftp_put($c, $remote, $local, FTP_ASCII) or die("Can't transfer");
ftp_get($c, $local, $remote, FTP_ASCII) or die("Can't transfer");

Функция ftp_put() принимает файл, находящийся на вашем компьютере, и копирует его на удаленный сервер; функция ftp_get() копирует файл с удаленного сервера на ваш компьютер.


В предыдущем фрагменте кода переменная $remote хранит путь к удаленному файлу, а переменная $local указывает на файл, находящийся на вашем компьютере.Этим функциям также передаются еще два параметра. Параметр FTP_ASCII (используемый в данном случае) сообщает о том, что файл передается как ASCII-текст. В этом случае завершающий символ перевода строки автоматически конвертируется при переходе от системы к системе. Есть и другой параметр, FTP_BINARY, указываемый для файлов, не являющихся простым текстом; при этом символ перевода строки не конвертируется.
Функции ftp_fget() и ftp_fput() позволяют загрузить и выгрузить файл через уже существующий указатель открытого файла (открытого с помощью функции fopen()) вместо использования точного местоположения в файловой системе. Например, ниже показано, как извлечь и записать файл по существующему указателю файла, $fp:

$fp = fopen($file, 'w');
ftp_fget($c, $fp, $remote, FTP_ASCII) or die("Can't transfer");

Наконец, чтобы закрыть соединение с удаленным хостом, вызовите функцию ftp_close():
ftp_close($c); or die("Can't close");

Для того чтобы установить продолжительность соединения в секундах, применяется функция ftp_set_option():

// Время до выхода – две минуты:
set_time_limit(120)
$c = ftp_connect('ftp.example.com');
ftp_set_option($c, FTP_TIMEOUT_SEC, 120);

Значение по умолчанию равно 90 секундам; однако по умолчанию значение параметра max_execution_time сценария PHP равно 30 секундам.


Поэтому надо проверить оба значения, если соединение закрывается слишком рано.

Для того чтобы с расширением cURL можно было работать, необходимо загрузить его с http://curl.haxx.se/ и установить параметр конфигурации --with-curl во время сборки PHP. Применение cURL начните с создания дескриптора cURL с помощью функции curl_init(), а затем укажите, что вы хотите сделать, вызвав функцию curl_setopt(). Последняя принимает три параметра: источник cURL, имя модифицируемой константы cURL и значение, присваиваемое второму параметру. В разделе «Решение» это константа CURLOPT_FILE:

$c = curl_init("ftp://$username:$password@ftp.example.com/$remote");
// переменная $local содержит путь к сохраняемому файлу на локальной машине
$fh = fopen($local, 'w') or die($php_errormsg);
curl_setopt($c, CURLOPT_FILE, $fh);
curl_exec($c);
curl_close($c);

Передаем URL в функцию curl_init(). Поскольку URL начинается с ftp://, cURL сам узнает, что должен применяться протокол FTP.того чтобы входить на сервер, реализуя отдельный вызов, вставляйте имя пользователя и пароль непосредственно в URL. Затем укажите местоположение сохраняемого файла на вашем сервере.


Теперь откройте файл с именем $local на запись и передайте дескриптор файла функции curl_setopt() в качестве значения константы CURLOPT_FILE. Передавая файл, cURL автоматически записывает данные в дескриптор файла. После того как все сконфигурировано, вызывается функция curl_exec(), инициализирующая транзакцию, а затем функция curl_close(), закрывающая соединение.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты
Отправка почты в кодировке MIME
Отправка сообщений в новостные группы Usenet
Поиск адресов с помощью LDAP
Поиск в DNS

Вернуться в раздел: PHP / 17. Интернет-службы