PHP работа с FTP создание FTP класса


Содержание

Создание файла через FTP Соединение

07.09.2012, 11:12

Создание файла через PHP
Всем привет! Пытаюсь создать файл, с помощью вот этого кода: ‹?php $pvar2 = isset($_POST) .

Редактирование файла через FTP Соединение
Мне надо в addons/amxmodx/configs/users.ini добавить строку как это можно сделать через ftp, если.

Пропадает ftp соединение через проводник
Windows7x86 HB Периодически перестает открывать любые ftp через проводник. Эти же ftp.

Создание документа программно через com соединение
Уважаемые, форумчане! Подскажите, пож-та, на что нужно уделять больше внимания при создания.

Другие возможности при работе с FTP

Переход в родительский каталог

Изменение текущего рабочего каталога на родительский производится с помощью функции ftp_cdup:

Изменение текущего рабочего каталога

Изменение текущего рабочего каталога на указанный осуществляется при помощи функции ftp_chdir:

Как видно из этого листинга, функция ftp_chdir имеет два параметра: дескриптор соединения $connect и имя нового каталога $new_dir.

Удаление файлов

Удалить файл с FTP-сервера можно с помощью функции ftp_delete:

Здесь ftp_connect — дескриптор соединения, а remote_file — имя удаляемого файла.

Создание каталога

Новый каталог можно создать, используя функцию ftp_mkdir:

Эта функция возвращает имя созданного каталога или false в случае неудачи:

Перечисление файлов в каталоге

Узнать, какие файлы находятся в текущем каталоге, можно применив функцию ftp_nlist:

Переименование файлов

Переименовать файлы на FTP-сервере осуществляется с помощью функции ftp_rename:

Удаление каталогов

Для удаления каталогов применяется функция ftp_rmdir:

Определение размера файлов

Для определения размера файлов существует функция ftp_size:

В случае неудачи функция возвращает -1. К примеру:

Посылка команды на сервер

Послать на сервер команду можно с помощью функции ftp_site:

Эта функция посылает на сервер команду SITE. Как правило, с помощью команд SITE выполняются такие команды операционной системы, как chmod. Список команд SITE, поддерживаемый сервером можно узнать, подключившись к нему и выполнив команду REMOTEHELP. Ниже приведен код, позволяющий изменить права доступа к файлу на удаленном сервере:

Работа через брандмауэр

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

Как правильно загружать файлы по FTP через PHP?

В PHP есть много функций для работы с FTP php.net/manual/ru/book.ftp.php но при их использовании у меня возникает проблема такого рода: если скрипт загружает файл на сервер и тут же обращается к нему через HTTP, то выдается 404 ошибка, то есть файл как бы не загружен. Однако если добавить sleep() после загрузки, то все проходит успешно.

Этот код рабочий, но если убрать sleep() то он перестает работать, $curl отдает 404 ошибку, в чем может быть проблема?

Update: Иногда sleep() в 10 секунд не помогает, даже при такой задержке возвращается ошибка 404.

Работа с FTP

File Transfer Protocol (FTP) (Протокол Передачи Файлов) используется многими компаниями и организациями для передачи данных. Python содержит модуль ftplib, который реализует клиентскую часть протокола FTP. Вы можете узнать всю интересующую вас информацию о FTP, обратившись к документу RFC 959 в интернете. Однако, в данной статье мы пройдемся лишь по ключевым вопросам данной темы:

  • Подключение к серверу FTP
  • Навигация по структуре
  • Загрузка файлов из сервера FTP
  • Заливка файлов на сервер FTP

Подключение к серверу FTP

Первое, что нам нужно сделать, это, собственно, найти сервер FTP, к которому мы будем подключаться. Существует множество бесплатных серверов, которые вы можете использовать. Например, большая часть дистрибутивов Linux имеют FTP зеркала, которые находятся в свободном доступе. На сайте Fedora (https://admin.fedoraproject.org/mirrormanager/) вы найдете длинный список зеркал, которые вы можете использовать.

Но среди них не только FTP, так что убедитесь в том, что подключаетесь к нужному протоколу, иначе возникнет ошибка подключения. Для нашего обучения, мы используем ftp.cse.buffalo.edu. В официальной документации Python используется ftp.debian.org, так что вы спокойно можете использовать и его. Давайте попробуем подключиться к серверу прямо сейчас. Откройте интерпретатор Python в вашем терминале, или используйте IDLE, совместно со следующим кодом:

Давайте немного притормозим. Здесь мы импортировали класс FTP из модуля ftplib. Далее, мы создали экземпляр класса, передав ему хост, к котором у мы хотим подключиться. Так как мы не передаем имя пользователя или пароль, Python предположит, что мы решили подключиться анонимно. Если так вышло, что вам нужно подключиться к серверу FTP используя нестандартный порт, тогда вам нужно использовать метод connect. Вот так:

Данный код не сработает, так как сервер FTP в данном примере не содержит открытый для нас порт 12345. Однако, суть в том, чтобы указывать, как подключиться к порту, который отключается от порта по умолчанию. Если сервер FTP, к которому вы подключаетесь, требует защиту TLS, то вам потребуется импортировать класс FTP_TLS вместо класса FTP. Класс FTP_TLS поддерживает keyfile и certfile. Если вы хотите защитить свое подключение, тогда вам нужно вызвать prot_p для этой цели.

Давайте узнаем, как посмотреть, что находится в сервере FTP и попробуем менять каталоги. Рассмотрим код, который отображает нормальный метод , которым этого можно достичь:

Здесь мы подключаемся и посылаем команду LIST серверу FTP. Это делается посредством вызова метода retrlines нашего объекта ftp. Метод retrlines выводит результат команды, которую мы вызывали. В данном примере мы вызывали команду LIST, которая извлекает список файлов и\или папок совместно их соответствующей информацией и выводит их. Далее мы использовали команду cwd, чтобы сменить нашу рабочую директорию на другую папку и выполняем команду LIST еще раз, чтобы увидеть, что в этой папке. Вы можете также использовать функцию dir вашего объекта ftp для получения списка данной папки.

Загрузка файлов через FTP

Простой просмотр содержимого FTP – не так уж и полезно. Вам практически в любом случае захочется скачать файл с сервера. Давайте разберемся с тем, как это делается:

В данном примере, мы подключились к FTP Debian Linux и сменили папку на папку debian. Далее мы называем файл, который мы хотим сохранить и открываем его в бинарном моде. Наконец мы используем retrbinary для вызова RETR для извлечения файла и записи его в на локальном диске. Если вы хотите скачать все файлы ftp, тогда вам нужен список файлов.

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

Обратите внимание на то, что команда nlst не указывает нам на то, как выполнять дифференциацию между файлами и каталогами из её результатов. Хотя в данном примере это не так уж и важно. Это относится к более сложным скриптам. В любом случае, данная команда зациклится над выданным списком и попробует скачать файлы. Если так вышло, что наш «файл» на самом деле является каталогом, то мы получим пустой файл на нашем диске с тем же названием, что и у каталога на FTP сервере. Также существует команда MLSD, которую вы можете вызвать при помощи метода mlsd, но её поддерживают не все FTP сервера. А с теми, которые поддерживают, вы можете заметить различия между ними.

Загрузка файлов на FTP сервер

Еще один важный вопрос, которым вы можете задаться при работе с FTP сервером, это загрузка файлов ftplib. С Python вы можете и это! Существует два метода, пользуясь которыми вы можете загружать файлы:


  • storlines – для загрузки текстовых файлов (TXT, HTML, RST)
  • storbinary – для загрузки бинарных файлов (PDF, XLS, etc)

Давайте посмотрим на примере, как мы будем это делать:

XXXIX. Функции для работы с FTP

Эти функции всегда доступны.

Для использования FTP функций, вы должны указать директиву —enable-ftp во время установки PHP 4 или —with-ftp при использовании PHP 3.

Версия PHP для Windows имеет встроенную поддержку данного расширения. Это означает, что для использования данных функций не требуется загрузка никаких дополнительных расширений.

Данное расширение не определяет никакие директивы конфигурации в php.ini .

Этот модуль использует один тип ресурса — идентификатор соединения с FTP сервером, возвращаемый функцией ftp_connect() или ftp_ssl_connect() .

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

Илон Маск рекомендует:  Командная строка

Дополнительная информация доступна в описании функции ftp_set_option() .

Следующие константы появились в PHP 4.3.0.

Дополнительная информация доступна в описании функции ftp_set_option() .

Автоматически определять позицию в файле, с которой начинается докачка при использовании команд GET и PUT (имеет смысл только совместно с FTP_AUTOSEEK )

Асинхронная операция завершилась неудачно

Асинхронная операция окончена

Асинхронная операция еще не завершена

Пример 1. Пример использования функций FTP

// установка соединения
$conn_id = ftp_connect ( $ftp_server );

// вход с именем пользователя и паролем
$login_result = ftp_login ( $conn_id , $ftp_user_name , $ftp_user_pass );

// проверка соединения
if ((! $conn_id ) || (! $login_result )) <
echo «Не удалось установить соединение с FTP сервером!» ;
echo «Попытка подключения к серверу $ftp_server под именем $ftp_user_name!» ;
exit;
> else <
echo «Установлено соединение с FTP сервером $ftp_server под именем $ftp_user_name» ;
>

// закачивание файла
$upload = ftp_put ( $conn_id , $destination_file , $source_file , FTP_BINARY );

// проверка результата
if (! $upload ) <
echo «Не удалось закачать файл!» ;
> else <
echo «Файл $source_file закачен на $ftp_server под именем $destination_file» ;
>

// закрытие соединения
ftp_close ( $conn_id );
?>

It may seem obvious to others, but it had me stumped for nearly an hour! If you can connect to an ftp site but some functions (list, put, get etc) don’t work, then try using ftp_pasv and set passive mode on.

// setup $host and $file variables for your setup before here.

$hostip = gethostbyname ( $host );
$conn_id = ftp_connect ( $hostip );

// login with username and password
$login_result = ftp_login ( $conn_id , $ftp_user_name , $ftp_user_pass );

// IMPORTANT. turn passive mode on
ftp_pasv ( $conn_id , true );

if ((! $conn_id ) || (! $login_result )) <
echo «FTP connection has failed!» ;
echo «Attempted to connect to $host for user $ftp_user_name» ;
die;
> else <
echo «Connected to $host, for user $ftp_user_name
» ;
echo «Host IP is $hostip
» ;

// upload a file
if ( ftp_put ( $conn_id , $remote_file , $file , FTP_ASCII )) <
echo «successfully uploaded $file
» ;
> else <
echo «There was a problem while uploading $file
» ;
>

// close the connection
ftp_close ( $conn_id );
>
?>

If you prefer a OO-approach to the FTP-functions, you can use this snippet of code (PHP5 only! and does add some overhead). It’s just a «start-up», extend/improve as you wish.
You can pass all ftp_* functions to your object and stripping ftp_ of the function name. Plus, you don’t have to pass the ftp-resource as the first argument.

For example:
( $ftp , $file ); // Where $ftp is your ftp-resource
?>

Can become:
-> delete ( $file ); // Where $ftp is your FTP-object
?>

Code:
class FTP <

/* public Void __construct(): Constructor */
public function __construct ( $host , $port = 21 , $timeout = 90 ) <
$this -> ftp = ftp_connect ( $host , $port , $timeout );
>

/* public Void __destruct(): Destructor */
public function __destruct () <
@ ftp_close ( $this -> ftp );
>

/* public Mixed __call(): Re-route all function calls to the PHP-functions */
public function __call ( $function , $arguments ) <
// Prepend the ftp resource to the arguments array
array_unshift ( $arguments , $this -> ftp );

// Call the PHP function
return call_user_func_array ( ‘ftp_’ . $function , $arguments );
>

Here’s a little function that I created to recurse through a local directory and upload the entire contents to a remote FTP server.

In the example, I’m trying to copy the entire «iwm» directory located at /home/kristy/scripts/iwm to a remote server’s /public_html/test/ via FTP.

The only trouble is that for the line «if (!ftp_chdir($ftpc,$ftproot.$srcrela))», which I use to check if the directory already exists on the remote server, spits out a warning about being unable to change to that directory if it doesn’t exist.

But an error handler should take care of it.

My thanks to the person who posted the snippet on retrieving the list of files in a directory.

For the version of the script that echo’s it’s progress as it recurses & uploads, go to: http://pastebin.com/73784

// set the various variables
$ftproot = «/public_html/test/» ;
$srcroot = «/home/kristy/scripts/» ;
$srcrela = «iwm/» ;

// start ftp’ing over the directory recursively
ftpRec ( $srcrela );

// close the FTP connection
ftp_close ( $ftpc );

// enter the local directory to be recursed through
chdir ( $srcroot . $srcrela );

if ( $handle = opendir ( «.» ))
<
while ( false !== ( $fil = readdir ( $handle )))
<
if ( $fil != «.» && $fil != «..» )
<
// check if it’s a file or directory
if (! is_dir ( $fil ))
<
// it’s a file so upload it
ftp_put ( $ftpc , $ftproot . $srcrela . $fil , $fil , FTP_BINARY );
>
else
<
// it’s a directory so recurse through it
if ( $fil == «templates» )
<
// I want the script to ignore any directories named «templates»
// and therefore, not recurse through them and upload their contents
>
else
<
ftpRec ( $srcrela . $fil . «/» );
chdir ( «../» );
>
>
>
>
closedir ( $handle );
>
>
?>

I have written an OpenSource ZIP2FTP interface, which actually takes a given ZIP file and decompresses it in the folder on an FTP server you specify.

Therefore it may be quite interesting for you people interested in FTP, its adress is http://zip2ftp.alishomepage.com ; those who directly want the source may visit http://zip2ftp.alishomepage.com/?do=getSource

//If you want to move or replicate the folder hierarchy from your current server to another remote server. Then this will be helpful as this will browse the current server’s directory and at the same time it will copy that file in the remote server in the same directory.

//This script will copy all the files from this directory and subdirectory to another remote server via FTP

function rec_copy ( $source_path , $destination_path , $con )
<
ftp_mkdir ( $con , $destination_path );
ftp_site ( $con , ‘CHMOD 0777 ‘ . $destination_path );
ftp_chdir ( $con , $destination_path );

if ( is_dir ( $source_path ))
<
chdir ( $source_path );
$handle = opendir ( ‘.’ );
while (( $file = readdir ( $handle ))!== false )
<
if (( $file != «.» ) && ( $file != «..» ))
<
if ( is_dir ( $file ))
<
// here i am restricting the folder name ‘propertyimages’ from being copied to remote server. — VK
if( $file != «propertyimages» )
<
rec_copy ( $source_path . «/» . $file , $file , $con );
chdir ( $source_path );
ftp_cdup ( $con );
>
>
if ( is_file ( $file ))
<
$fp = fopen ( $file , «r» );
// this will convert spaces to ‘_’ so that it will not throw error. — VK
ftp_fput ( $con , str_replace ( » » , «_» , $file ), $fp , FTP_BINARY );
ftp_site ( $con , ‘CHMOD 0755 ‘ . str_replace ( » » , «_» , $file ));
>
>
>
closedir ( $handle );
>
>


// make a FTP connection —VK
$con = ftp_connect ( «69.18.213.131» , 21 );
$login_result = ftp_login ( $con , «username» , «password» );

// this is the root path for the remote server— VK
$rootpath = «mainwebsite_html» ;

// this is the physical path of the source directory. actually u can also use the relative path. — VK
$sourcepath = realpath ( «../» ). «/resdesk» ;

// this directory name will only change the top most directory and not the inner one — VK
$destination_dir_name = «resdesk_» . $account_id . «/» ;

rec_copy ( $sourcepath , $destination_dir_name , $con );
if ( function_exists ( «ftp_close» ))
<
ftp_close ( $con );
>
?>

Here’s another FTP interface over PHP (also uses MySQL)

PS: this script will ALSO allow you to download its source. So it becomes interesting for YOU PROGRAMMERS as well :D

I think what some other posts were trying to say which may need clarification is that in PHP 4.2.3, ftp_connect(«myhost.com») was failing most of the time, except it would work like every few minutes.

The fix is that ftp_connect seems to have a bug resolving addresses. If you do:

$hostip = gethostbyname($host);
$conn_ >
It seems to solve the problem.
(Other users referred to an ftpbuf() error. not sure what that is, but this should fix it.)

connection to a ftp server across proxy

$ftp_server = «proxy»; f.e. 123.456.789.10
$ftp_user_name = «username@ftpserver»; f.e. exampleuk@www.example.uk
$ftp_user_pass = «password»;

$conn_ > $login_result = ftp_login( $conn_id, $ftp_user_name, $ftp_user_pass );

Работа с FTP-сервером

Работа с FTP-сервером

ftp_connect

Производит подключение к FTP-серверу.

Синтаксис:

int ftp_connect(string host [, int port])

В функции ftp_connect() аргумент host указывает имя сервера, к которому производится подключение, а необязательный аргумент port указывает какой порт нужно использовать (по умолчанию это 21).

Функция возвращает дескриптор потока FTP или false в случае ошибки.

ftp_pasv

Производит переключение пассивного режима.

Синтаксис:

int ftp_pasv(int ftp_stream, int pasv)

Функция ftp_pasv() производит переключение режима подключения в пассивный, в случае, если аргумент pasv равен true. Если false — то режим подключения будет активный.

В пассивном режиме передача данных инициируется клиентом, а в активном — сервером (это бывает необходимо при блокировке портов у клиента).

Функция возвращает true или false при ошибке.

ftp_login

Производит вход на сервер FTP.

Синтаксис:

int ftp_login(int ftp_stream, string username, string password)

Функция ftp_login() производит регистрацию в системе под именем username с паролем password. Возвращает true или false при ошибке.

ftp_quit

Производит завершение сеанса FTP.

Синтаксис:

int ftp_quit(int ftp_stream)

ftp_pwd

Производит определение текущего каталога.

Синтаксис:

int ftp_pwd(int ftp_stream)

Эта функция возвращает текущий каталог FTP-сервера или false при ошибке.

ftp_cdup

Производит переход в корневой каталог.

Синтаксис:

int ftp_cdup(int ftp_stream)

Функция возвращает true или false при ошибке.

ftp_chdir

Производит переход в каталог.

Синтаксис:

int ftp_chdir(int ftp_stream, string directory)

Функция возвращает true или false при ошибке.

ftp_mkdir

Производит создание каталога.

Синтаксис:


int ftp_mkdir(int ftp_stream, string directory)

Функция возвращает имя созданного каталога или false при ошибке.

ftp_rmdir

Производит удаление каталога.

Синтаксис:

int ftp_rmdir(int ftp_stream, string directory)

Функция true или false при ошибке.

ftp_nlist

Производит получение листинга каталога.

Синтаксис:

int ftp_nlist(int ftp_stream, string directory)

Функция ftp_nlist() возвращает массив файловых имен или false при ошибке.

Илон Маск рекомендует:  Как в Word убрать фон текста

ftp_rawlist

Получение подробного листинга каталога.

Синтаксис:

int ftp_rawlist(int ftp_stream, string directory)

Функция ftp_rawlist() выполняет FTP-команду LIST, и возвращате его результаты в массиве, где каждый элемент соответствует строке текста «как есть». Идентификатор типа системы, возвращаемый ftp_systype(), может быть использован для определения того, как следует интерпретировать результаты.

ftp_systype

Возвращает системный идентификатор типа FTP-сервера.

Синтаксис:

int ftp_systype(int ftp_stream)

Функция возвращает строковое значение или false в случае ошибки.

Похожие главы из других книг

10.4. Команды управления сервером DNS

10.4. Команды управления сервером DNS Для управления сервером DNS используется программа ndc. Ее можно использовать с параметрами start, stop, reload, restart.Параметр start запускает сервер, a stop — останавливает. Параметр reload перезагружает файлы зоны, если в них произошли изменения, а

Установление клиентского соединения с сервером

Установление клиентского соединения с сервером Если имеется сервер с сокетом в режиме прослушивания, клиент может соединиться с ним при помощи функции connect. int connect(SOCKET s, LPSOCKADDR lpName, int nNameLen); Параметрыs — сокет, созданный с использованием функции socket.lpName — указатель на

Аутентификация пользователя сервером

Аутентификация пользователя сервером Пользователь А отправляет на сервер В запрос, состоящий из билета, который был прислан в ответе ЦРК, и аутентификатора, который содержит текущее значение даты и времени, зашифрованное ключом KAB ( KAB — сеансовый ключ для пользователя

18.2.3. Взаимодействие с РОР-сервером

18.2.3. Взаимодействие с РОР-сервером Многие серверы электронной почты пользуются почтовым протоколом (Post Office Protocol — POP). Имеющийся в Ruby класс POP3 позволяет просматривать заголовки и тела всех сообщений, хранящихся для вас на сервере, и обрабатывать их как вы сочтете нужным.

18.2.5. Взаимодействие с IMAP-сервером

Работа с FTP-сервером

Работа с FTP-сервером ftp_connectПроизводит подключение к FTP-серверу.Синтаксис:int ftp_connect(string host [, int port])В функции ftp_connect() аргумент host указывает имя сервера, к которому производится подключение, а необязательный аргумент port указывает какой порт нужно использовать (по умолчанию

Взаимодействие с DNS-сервером

Взаимодействие с DNS-сервером Если вы хотите, чтобы к клиенту DHCP мог непосредственно обратиться любой узел сети, добиться этого можно двумя способами. Вы можете сконфигурировать сервер DHCP так, чтобы он предоставлял клиенту фиксированный IP-адрес (необходимые действия

Настройка X-клиента для работы с Х-сервером

Настройка X-клиента для работы с Х-сервером Независимо от того, используете ли вы xhost или xauth, вы должны сконфигурировать клиентскую систему для работы с нужным X-сервером. Если, например, вы работаете за компьютером term.threeroomco.com, зарегистрировались на узле biggie.threeroomco.com и

Использование клиента VNC для взаимодействия с сервером

Использование клиента VNC для взаимодействия с сервером Программа, реализующая функции клиента VNC в системе Linux, называется vncviewer. Для вызова клиента надо ввести имя программы и, возможно, имя сервера и номер дисплея.$ vncviewer vncserv.threeroomco.com:1VNC server supports protocol version 3.3 (viewer 3.3)Password:При

Резервное копирование, инициируемое сервером

Резервное копирование, инициируемое сервером При выполнении копирования, инициируемого сервером, на компьютере, к которому подключен накопитель (сервере резервного копирования), выполняется клиентская программа, поддерживающая сетевое соединение с клиентом

Резервное копирование, инициируемое сервером

Резервное копирование, инициируемое сервером Как было сказано ранее, резервное копирование, инициируемое сервером, дает возможность составить график создания резервных копий и соблюдать его. При этом основные действия по настройке производятся на компьютере,

Взаимодействие с сервером DHCP

Взаимодействие с сервером DHCP Если в вашей сети IP-адреса распределяются посредством сервера DHCP, вы не сможете задавать фиксированные адреса в конфигурационном файле зоны, так как адрес, выделенный клиенту DHCP, становится известным лишь при его загрузке и может измениться

17.4.3. Соединение с сервером

17.4.3. Соединение с сервером Процесс соединения с сервером через сокет домена Unix состоит из создания сокета и присоединения к требуемому адресу через функцию connect(). Как только сокет присоединен, он может обрабатываться как любой другой файловый дескриптор.Следующая

Как настроить Internet Explorer на работу с прокси-сервером

Как настроить Internet Explorer на работу с прокси-сервером Для настройки Internet Explorer на работу с прокси-сервером:1. В меню Сервис выбираем Свойства обозревателя.2. Переходим на вкладку Подключения (рис. 10.9). 3. Если у вас используется модемное соединение (Dial-up), нужно выбрать его и

Работа со встроенным сервером

Работа со встроенным сервером Встроенный сервер для Windows имеет те же возможности, что и Суперсервер, за исключением поддержки множества пользователей и защиты по паролю. Клиентская библиотека включена в сервер, и эта объединенная пара выполняет работу как клиента, так и

Пример: передача двоичных структур между клиентом и сервером

Пример: передача двоичных структур между клиентом и сервером Теперь мы изменим код клиента и сервера, чтобы передавать через сокет не текстовые строки, а двоичные значения. Мы увидим, что клиент и сервер работают некорректно, когда они запущены на узлах с различным

PHP работа с FTP: создание FTP класса


Для выполнения запросов в протоколе FTP используются команды. Например, команда LIST предназначена для получения списка файлов каталога сервера, команда STOR применяется для сохранения файла и так далее. В .NET для отправки нужной команды нам не надо запихивать ее в тело запроса, так как можно использовать свойство Method класса FtpWebRequest.

Этот метод в качестве значения принимает строки, определенные в классе WebRequestMethods.Ftp :

AppendFile : добавляет в запрос команду APPE, которая используется для присоединения файла к существующему файлу на FTP-сервере

DeleteFile : добавляет в запрос команду DELE, которая используется для удаления файла на FTP-сервере

DownloadFile : добавляет команду RETR, которая используется для загрузки файла

GetDateTimestamp : представляет команду MDTM, которая применяется для получения даты и времени из файла

GetFileSize : команда SIZE, получение размера файла

ListDirectory : команда NLIST, возвращает краткий список файлов на сервере

ListDirectoryDetails : команда LIST, возвращает подробный список файлов на FTP-сервере

MakeDirectory : команда MKD, создает каталог на FTP-сервере

PrintWorkingDirectory : команда PWD, отображает имя текущего рабочего каталога

RemoveDirectory : команда RMD, удаляет каталог

Rename : команда RENAME, переименовывает каталог

UploadFile : команда STOR, загружает файл на FTP-сервер

UploadFileWithUniqueName : команда STOU, загружает файл с уникальным именем на FTP-сервер

Однако в реальности при работе с конкретными ftp-серверами нам не все эти команды будут доступны в силу ограничений на чтение/запись на стороне сервера, которые может установить администратор.

Например, загрузим текстовый файл на фтп-сервер:

Для загрузки на сервер у нас, естественно, должны быть права на запись. Возможно, потребуется установить логин и пароль для доступа к серверу.

С помощью другой команды получим содержимое сервера:

Поскольку в данном случае сервер возвращает текстовую информацию о файлах и каталогах, то с помощью объекта StreamReader мы можем считать ее и вывести на консоль:

Работа с FTP средствами PHP

Протокол FTP (File Transfer Protocol — протокол передачи файлов) — один из старейших протоколов Интернета, предназначенный для передачи файлов между двумя хостами.

Как правило, при работе с FTP выполняются следующие стандартные действия:

соединение с удаленным FTP-сервером
регистрация на FTP-сервере
загрузка файлов с сервера или на сервер
закрытие соединения
Соединение с FTP-сервером
Соединение с удаленным FTP-сервером выполняется с помощью функции ftp_connect:

ftp_connect (string host [, int port [, int timeout]])

В качестве обязательного параметра эта функция принимает имя хоста host, с которым необходимо установить соединение. Второй необязательный параметр port указывает на номер порта, через который осуществляется соединение. Если этот параметр не указан, то соединение осуществляется через порт 21, являющийся стандартным FTP-портом. Третий необязательный параметр определяет максимально время выполнения сценария (тайм-аут) и по умолчанию равен 90 секундам.

Соединение с удаленным FTP-сервером

Регистрация на FTP-сервере
После того, как соединение установлено, необходимо зарегистрироваться на сервере с определенным именем и паролем. Сделать это можно при помощи функции ftp_login.

Регистрация на FTP-сервере

Как видно из листинга, функция ftp_login принимает три параметра: дескриптор FTP-соединения, возвращаемый функцией ftp_connect, имя пользователя и пароль.

Замечание: Регистрация на сервере не требуется, если FTP-сервер является анонимным.

Закрытие соединения
По окончании сеанса связи с FTP-сервером, нужно закрыть FTP-соединение с помощью функции ftp_quit, принимающей в качестве единственного параметра дескриптор FTP-соединения:

Загрузка файлов с сервера
Загрузка файлов с сервера осуществляется при помощи функции ftp_get:

bool ftp_get(int ftp_connect, string local_file,
string remote_file, int mode);

Аргумент mode, задающий режим пересылки файлов, должен быть указан как константа FTP_BINARY или FTP_ASCII. Режим FTP_ASCII используется для пересылки файлов, состоящих только из ASCII-символов (т. е. текстовых файлов), а двоичный режим — для пересылки всех остальных файлов.

Переход в родительский каталог
Изменение текущего рабочего каталога на родительский производится с помощью функции ftp_cdup:

bool ftp_cdup(int ftp_connect);

Изменение текущего рабочего каталога
Изменение текущего рабочего каталога на указанный осуществляется при помощи функции ftp_chdir:

Как видно из этого листинга, функция ftp_chdir имеет два параметра: дескриптор соединения $connect и имя нового каталога $new_dir.

Удаление файлов
Удалить файл с FTP-сервера можно с помощью функции ftp_delete:

bool ftp_delete(int ftp_connect, string remote_file);

Здесь ftp_connect — дескриптор соединения, а remote_file — имя удаляемого файла.

Создание каталога
Новый каталог можно создать, используя функцию ftp_mkdir:

string ftp_mkdir(int ftp_connect, string directory);

Эта функция возвращает имя созданного каталога или false в случае неудачи:

Перечисление файлов в каталоге
Узнать, какие файлы находятся в текущем каталоге, можно применив функцию ftp_nlist:

array ftp_nlist(int ftp_connect, string directory);

Переименование файлов
Переименовать файлы на FTP-сервере осуществляется с помощью функции ftp_rename:

bool ftp_rename(int ftp_connect, string from, string to);

Удаление каталогов
Для удаления каталогов применяется функция ftp_rmdir:

bool ftp_rmdir(int ftp_connect, string directory);

Определение размера файлов
Для определения размера файлов существует функция ftp_size:

int ftp_size(int ftp_connect, string filepath);

В случае неудачи функция возвращает -1. К примеру:

Посылка команды на сервер
Послать на сервер команду можно с помощью функции ftp_site:


bool ftp_site(int ftp_connect, string command);

Эта функция посылает на сервер команду SITE. Как правило, с помощью команд SITE выполняются такие команды операционной системы, как chmod. Список команд SITE, поддерживаемый сервером можно узнать, подключившись к нему и выполнив команду REMOTEHELP. Ниже приведен код, позволяющий изменить права доступа к файлу на удаленном сервере:

Илон Маск рекомендует:  Что такое код imagechar

Работа через брандмауэр
При работе с FTP-сервером через брандмауэр часто бывает необходимо изменить активный режим, при котором соединение инициируется сервером, на пассивный, при котором соединение инициируется клиентом. Это можно сделать, применив функцию ftp_pasv:

Отправить сообщение об ошибке
Если нашли ошибку в тексте выделите ее мышкой и нажмите сочетание клавиш Ctrl+ENTER, укажите правильный текст без ошибки.

Что такое FTP и как работать в Filezilla

Что такое FTP

FTP расшифровывается как File Transfer Protocol, то есть протокол, который используется для передачи файлов. Чаще всего вы можете услышать эту аббревиатуру в отношении глобальной сети – утилиты, работающие по протоколу FTP, помогают загружать файлы на серверы, что особенно полезно, если вы администрируете сайты. Если выражаться более простым языком, то данный протокол позволит вам подключиться к какой-либо удаленной папке и работать с ней, в том числе загружая на нее (или из нее) нужные вам файлы. Для того, чтобы воспользоваться FTP, вам только нужно убедиться, что сеть поддерживает протокол TCP/IP (по этому протоколу, например, работает Интернет).

Нужно также отметить, что протокол FTP появился давно – в 1971 году, для сравнения протокол HTTP был создан почти через двадцать лет, в 1992 году, и в плане работы с файлами FTP до сих пор является предпочтительным протоколом.

Почему? Причин много. Например, при обрыве соединения – а бывает, как мы знаем, всякое – FTP позволит вам потом докачать файл, а не начинать его скачивание заново. Да и само скачивание происходит не по одному, а сразу по нескольким потокам параллельно. Для маленьких файлов это не очень важно, а вот если вы собираетесь загружать массивные файлы, то передача по FTP будет очень кстати.

При этом HTTP протокол тоже может быть полезен – он используется для передачи веб-страниц, которые представляют собой не что иное, как текстовые файлы с кодом, а также небольших файлов. Его рекомендуют использовать для скачивания файлов с сайта, так как чаще всего, используя этот протокол, пользователи не смогут управлять и изменять файлы (что значительно более безопасно, чем при использовании протокола FTP).

Почему Filezilla?

Существует много разных FTP-клиентов, я советую использовать именно Filezilla. Причины расскажу ниже.

Выше мы уже обговорили, что протокол FTP удобен для передачи файлов, однако он имеет много уязвимостей в защите и является небезопасным. Иными словами, незашифрованные данные, которые вы передаете по этому протоколу, могут быть перехвачены кем угодно – а если речь идет о личных данных (логинах, паролях), то вы можете представить, чем это может вам обернуться. Поэтому для того, чтобы обезопасить свои данные от кражи, необходимо использовать другие, безопасные протоколы FTPS или SFTP. Filezilla отличается тем, что поддерживает эти протоколы (для того, чтобы использовать безопасный протокол, в программе необходимо выбрать «Файл» -> «Менеджер сайтов» -> во вкладке «Общие» изменить протокол с FTP на SFTP).

Другими преимуществами Filezilla являются бесплатное использование, поддержка русского языка и кроссплатформенность (можете установить это ПО на машины с Linux, Windows или даже Mac OS X). Чуть подробнее почитать можно на русскоязычном сайте http://filezilla.ru/ Там же вы найдете и документацию, а также полезные статьи.

Работа в Filezilla

Работать в Filezilla намного проще, чем может показаться на первый взгляд. Зачастую пользователи предпочитают проверенные пути вместо того, чтобы потратить несколько минут на изучение новой технологии. Поэтому постараюсь в этой статье максимально понятно рассказать о том, как же правильно использовать Filezilla в своих целях.

Установить Filezilla вы можете прямо с официального сайта: https://filezilla-project.org/download.php?type=client

Настройка Filezilla

Для того, чтобы настроить Filezilla, вам необходимо знать свой логин и пароль от панели управления, а также название хоста. Timeweb присылает эту информацию после регистрации в приветственном письме (там отдельно будут указаны данные для использования FTP), а также на главной странице панели управления (смотрим блок «Доступ по FTP»):

Теперь открывайте Filezilla и вводите все эти данные в соответствующие строки:

В поле «Порт» напишите 21 (этот порт использует FTP). Затем нажимайте «Быстрое соединение».

Внимание!
Иногда на этом этапе у вас может возникнуть ошибка ENETUNREACH — Сеть недоступна, из-за которой соединение не будет установлено. Решается данная проблема легко – выключением (или временным приостановлением) антивирусной программы.

Если соединение установлено правильно, то в блоке справа внизу вы увидите список файлов, которые доступны на вашем аккаунте (по сути, это же самое вы увидите, если зайдете в панели управления хостингом в раздел «Файловый менеджер»).

Но каждый раз при запуске Filezilla заново вводить эти данные, согласитесь, неудобно, поэтому мы сделаем следующее:

  1. Открываем «Менеджер сайтов».
  2. Нажимаем «Новый сайт» (по желанию переименовываем его).
  3. Тип входа: вместо «Анонимный» ставим «Нормальный».
  4. Вводим все данные.
  5. Нажимаем «ОК» или «Соединиться»

Теперь после запуска программы вы можете просто нажать на стрелку вниз рядом со значком «Менеджер сайтов», выбрать аккаунт и подключиться к нему. Это особенно удобно, если у вас несколько сайтов на разных серверах.

Кстати, во вкладке «Дополнительно» вы можете указать путь к какой-то конкретной папке на сервере (строка «Удаленный каталог по умолчанию), и тогда при каждом подключении вы будете попадать не в корневой каталог, а в заданную папку.

Управление файлами

Я думаю, что чисто интуитивно вы уже разобрались, что папки, которые слева, — это то, что есть на вашем компьютере. А справа – то, что находится на хостинге.

Вы можете заходить в них, смотреть и т.д. – в общем, как на обычном компьютере. Точно так же осуществляется и перенос файлов/папок между вашим компьютером и сервером – просто перетащите нужный вам элемент из одной области в другую (drag-and-drop).

Также вы можете нажать правой кнопкой мыши на файле или папке на вашем компьютере и выбрать верхнюю строчку «Закачать на сервер» – элемент будет загружен в открытую справа папку на сервере. При этом если файл не загрузился мгновенно (а имеет большой вес), то внизу, во вкладке «Файлы в задании» вы увидите зеленую полосу загрузки:

Чтобы создать папку на сервере, нажмите правую кнопку мыши в области справа, где отображены папки и файлы сервера, далее выберите «Создать каталог» и присвойте ему любое название (но обязательно латинскими символами!).

Хотите удалить или переименовать? Все точно так же возможно по щелчку правой кнопки мыши.

Аналогично вы можете и перейти к редактированию файлов (пункт «Просмотр/Правка»), при этом можно использовать как программу по умолчанию, так и выбрать какой-нибудь редактор. Чтобы настроить автоматическое открытие файлов другим редактором, выберите пункт «Редактирование» в верхнем меню, затем «Формат файлов» – и сделайте активным пункт «Использовать следующий редактор» (с последующим выбором нужной вам программы):

Filezilla позволяет настраивать и права доступа: для этого на элемент нужно нажать правой кнопкой мыши и выбрать «Права доступа к файлу».

Работать с файлами можно и в отложенном режиме: допустим, вы выбрали файлы, которые вам нужно перенести на сервер – выберите их, нажмите правую кнопку мыши и строчку «Добавить файлы в задание» (даже в том случае, если вы не подключены к серверу). Они отобразятся в блоке ниже. Затем подключитесь к серверу, снова кликните правой кнопкой по ним и выберите «Выполнить задание» — все файлы будут перенесены на сервер.

Отдельно стоит рассказать о синхронизированном просмотре. Для того, чтобы его активировать, вам нужно нажать соответствующий значок чуть ниже верхнего меню (под надписью «Закладки»):

Зачем это использовать? Допустим, у вас на компьютере есть папка с файлами вашего сайта – точно такими же, как и на хостинге. Файлов, как и папок, может быть очень много – и вот для удобства ориентирования в них и был добавлен такой режим: переходя из папки в папку в одном окне (допустим, серверном), вы будете точно так же, синхронно переходить в окне, где отображается содержимое вашего компьютера. Режим позволит вам не запутаться во множестве этих папок. Но, естественно, действует он лишь в том случае, если названия директорий полностью совпадают.

Заключение

Filezilla – это простой, удобный и функциональный инструмент для работы с файлами на сервере. К тому же он абсолютно бесплатный. Надеюсь, моя статья оказалась вам полезной. Если есть вопросы, спрашивайте – обязательно отвечу!

Fully OO Ftp library for php

I was trying to build an application that will download some files from various ftp servers to a local directory. Later I would upload them to other ftp servers.

The application is built using Zend framework.

The thing is I can’t find a class to handle ftp download/upload functions in Zend framework.

The only class available is Zend_File_Transfer which has the following comment:

The current implementation of Zend_File_Transfer is limited to HTTP Post Uploads. Other adapters supporting downloads and other protocols will be added in future releases. Unimplemented methods will throw an exception. For now, you should use Zend_File_Transfer_Adapter_Http directly. As soon as there are multiple adapters available you can use a common interface.

I need to be able to do the following:

  • Upload multiple files.
  • Get a remote directory listing of all files.
  • Set validators
  • Set filters
  • Set paths
  • Rename files
  • Wrapper for downloads
  • Exceptions for various errors during operation.

Is there a solution to this problem in Zend framework? Could you recommend an alternative library for ftp operations ?

Thanks in advance

UPDATE:

  • I checked the PEAR package and unfortunately it’s still in alpha release. Moreover their functions return errors not exception once a problem occur like download failure or remote path weren’t found.
  • Unfortunately Skjb_Ftp isn’t complete as many functions don’t have an implementation.
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL