Advertisement
  1. Code
  2. PHP

Как работать с PHP и FTP

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

В этом руководстве наша цель - создать класс FTP на PHP, который будет хорошо написан, полезен и расширяем.

Наша цель

Всегда важно сначала определить, какие именно функции должен включать ваш класс. В нашем случае:

  • подключение к серверу
  • создать папку на сервере
  • загрузить файл
  • сменить каталог
  • получение списка каталогов
  • скачать файл

Когда я буду использовать класс FTP?

Есть несколько случаев, когда можно использовать этот класс. Пара сценариев может быть:

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

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


Что такое FTP?

FTP: «Стандартный сетевой протокол, используемый для копирования файла с одного хоста на другой».

FTP, или протокол передачи файлов, как определено в Википедии: «Стандартный сетевой протокол, используемый для копирования файла с одного хоста на другой по сети на основе TCP / IP, такой как Интернет».

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


Шаг 1 - Подготовка

Мы начнем как можно проще. В корне вашего нового проекта создайте два файла: index.php и ftp_class.php.

Файл index.php - это наша главная страница, которая создает объект и вызывает необходимые методы. Ftp_class.php - это просто наш класс ftp.

На следующем шаге мы собираемся создать каркас для нашего класса. Как только это будет сделано, вы сможете следить за каждым шагом.


Шаг 2 - Настройка класса

Сила объектно-ориентированного программирования (ООП) состоит в том, чтобы предоставить сложному коду простой в использовании интерфейс. Создавая класс - думайте о классе как о шаблоне - вы можете инкапсулировать данные, что является просто жаргоном для термина, который относится к сокрытию данных. Затем мы можем многократно использовать этот класс без необходимости переписывать какой-либо код. Вместо этого вам нужно только вызвать соответствующие методы (термин «method» такой же, как и function).

Давайте начнем создавать наш класс ftp. Откройте файл ftp_class.php и добавьте следующий код. Это базовая структура скелета класса, которую я назвал «FTPClient».

Функция construct , известная как конструктор, представляет собой специальный метод класса, который автоматически вызывается классом при создании нового объекта или экземпляра класса. Обычно это хорошее место для добавления инициализации; но для сегодняшних целей нам это не нужно. Тем не менее, мы будем держать его здесь для будущего использования.

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


Шаг 3 - Переменные класса

Далее мы установим некоторые переменные класса или свойства.

Префикс private определяет область действия переменной. В этом случае это означает, что переменная не может быть доступна из-за пределов класса.

Переменная $connectionId будет хранить наш поток соединения. Два других хранят статус и любые сообщения. $loginOk будет полезен при определении, правильно ли мы подключены.


Шаг 4 - Простая регистрация сообщений

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

Обратите внимание, что мы не возвращаем return реальные сообщения из наших методов. Вместо этого мы возвращаем true или false, основываясь на том, была ли конкретная операция успешной. Это имеет свои преимущества, но также не детализирует пользователю, что происходит.

Добавьте следующие два метода, чтобы мы могли определить, что успешно.

Этот метод принимает переменную $message. Содержимое этой переменной затем сохраняется в нашем массиве класса благодаря строке: $this-> messageArray[] = $ message;

Поскольку $messageArray является переменной класса, мы можем получить к ней доступ через нотацию $this->.

Внутри класса $this относится к самому объекту.

Чтобы получить сообщение, мы вызываем getMessages.

Этот метод является public методом. Как упоминалось ранее, private/public значение просто относится к области действия переменной или, в данном случае, к методу. Private метод (или переменная) не может быть доступен вне класса, в то время как public метод (или переменная) может.

Поскольку наша переменная является private, нам нужен способ доступа к ней. Мы делаем это, предоставляя нашему классу public метод, к которому мы можем получить доступ за пределами класса. Вы можете удивиться, почему мы не можем просто сделать общедоступной переменную messageArray. Мы можем; Тем не менее, это просто не очень хорошая практика.

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


Шаг 5 - Подключение

На этом шаге мы добавим метод connect. Это позволит нам подключиться к FTP-серверу.

Мы передаем информацию о соединении: сервер ($server), имя пользователя ($ftpUser) и пароль ($ftpPassword), чтобы позволить нам установить соединение.

Первая строка кода открывает FTP-соединение с ftp_connect к указанному серверу. Мы сохраняем наше соединение с переменной класса $connectionId, описанной выше.

Код ftp_login регистрирует нас на указанное соединение, передавая наш connection id, наше имя пользователя и пароль.

Вы могли заметить строку кода ftp_pasv. Он, как следует из комментария, включает/выключает пассивный режим. Я бы посоветовал вам отключить его, однако, если у вас возникнут какие-либо проблемы с подключением, попробуйте включить его. Пассивный режим может вызвать проблемы с подключением через FTP.

Мы определяем, было ли соединение успешным. Затем мы регистрируем результаты, вызывая наш простой метод обработчика сообщений, logMessage(), и передаем строку в log. Помните: мы используем $this-> для доступа к logMessage(), так как это переменная класса.


Шаг 6 - Вызов объекта

Теперь, когда наш класс работает, мы можем проверить это! Откройте файл index.php и добавьте следующий код.

Вам понадобится доступ к FTP-серверу. Если вы хотите настроить свой собственный сервер, попробуйте Filezilla - это бесплатно.

Вы заметите, что я добавил детали FTP-сервера здесь. В идеале они будут храниться в вашем файле config. Измените их в соответствии с настройками вашего FTP-сервера.

После определения деталей нашего FTP-сервера мы включаем класс с помощью include('ftp_class.php') ;. Это означает: сделать класс доступным на этой странице. Следующая строка создает объект нашего класса FTP и сохраняет его в переменной $ftpObj. $ftpObj теперь будет использоваться для доступа к любым публичным методам в нашем классе. Это делается с помощью нотации ->, как в следующей строке, вызывая метод $ftpObj -> connect и передавая ему данные нашего сервера.

Как видите, как только наш класс на месте, подключиться к нашему FTP-серверу очень просто!


Шаг 6b - Просмотр вывода

На последнем шаге мы можем заключить вызов connect в оператор if, как показано ниже. Тогда, если мы не сможем подключиться, зависимый код не будет выполнен. Затем мы можем вывести любые сообщения пользователю, такие как «подключен» или «не удалось».

Это нормально, хотя наш код быстро раздуется операторами IF/ELSE, если мы добавим это ко всем нашим вызовам. Вместо этого я хотел бы предложить альтернативу, которая сделает код немного чище и легче.

Помните методы обработки сообщений, которые мы добавили? Если вы хотите видеть сообщения, созданные классом - полезные для отладки/обратной связи - вы можете добавить следующий код после любого метода, который вы вызываете.

Он покажет сообщение класса.


Шаг 7 - Создание нашего первого каталога

Отлично, теперь пришло время сделать что-то полезное. Первый метод, который мы собираемся создать, это метод makeDir. Как и ожидалось, этот метод создаст для нас каталоги на сервере. Единственные параметры, которые мы передадим - это путь к каталогу и имя папки; мы назовем это $directory. Волшебная палочка здесь - встроенная функция ftp_mkdir. Она использует наш сохраненный «connectionId» и переданную переменную $directory для создания папки.

Добавьте следующий код в ваш файл ftp_class.php:

И, чтобы вызвать его из вашего файла index.php, добавьте:

Переменная $dir установлена на имя папки, которую мы хотим создать на сервере. В данном случае: «photos».

Следующая строка вызывает метод, который создаст папку.

Если вы получили сообщение об ошибке «Отказано в доступе», убедитесь, что вы можете писать в указанной папке. Вам может потребоваться создать папку в каталоге, например /httpdocs.


Шаг 8 - Загрузка файла

Продолжая, давайте загрузим фотографию, которая называется zoe.jpg. При загрузке файла нам нужно указать, какой тип файла мы загружаем - binary или ascii? По сути, если вы загружаете текстовый файл, вы должны использовать ascii; в противном случае он должен быть установлен как бинарный файл.

Мы начнем с установки array со всеми расширениями, которые мы должны использовать для загрузки типа ascii.

Затем мы извлекаем расширение нашего файла, чтобы мы могли проверить, является ли он одним из типов ascii. Мы определяем это, получая расширение загружаемого файла. Быстрый и грязный метод, который я использовал здесь это
"exploding", используя '.' в качестве разделителя. Он разделит файл на части и сохранит их в виде массива array. Используя другую встроенную функцию PHP «end», мы выбираем последний элемент массива array, который содержит наше расширение. Вот немного кода.

Затем мы проверяем, присутствует ли наше расширение в списке (с in_array) расширений файлов, которые должны быть загружены как тип ascii. Если он появляется в списке, мы устанавливаем переменную $mode в FTP_ASCII; в противном случае мы предполагаем, что это двоичный тип, и присваиваем $mode значение FTP_BINARY.

ftp_put загружает файл из вашего локального местоположения в удаленный файл на FTP-сервере. Мы передаем ему наш «connectionId», путь к файлу, по который мы хотим загрузить ($fileTo), путь
файла, который мы хотим загрузить ($file From), и режим ($mode), который мы только что определили.

Затем добавьте следующий метод в ваш файл ftp_class.php:

Конечно, вы можете создать или загрузить любое имя папки по вашему желанию! Добавьте этот следующий фрагмент кода в файл index.php и внесите соответствующие изменения.

К настоящему времени вы уже должны были удостовериться, насколько просто использовать этот класс! Мы просто делаем отдельные вызовы для выполнения наших задач - все благодаря объектно-ориентированному программированию!


Шаг 9 - Просмотр файлов

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

Метод changeDir использует «ftp_chdir» для изменения текущего каталога на ftp-сервере. Просто перейдите в каталог, чтобы изменить. Просто и мило.

ftp_class.php:

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

Если вы хотите, вы можете переопределить это, передав путь к каталогу в $directory , содержимое которого вы хотите просмотреть. Переменная $parameters по умолчанию равна -la. Это команда Linux для отображения дополнительной информации о каталоге. Не бойтесь удалить его или передать пустую строку.

ftp_class.php:

Метод getDirListing возвращает массив, который содержит наш массив array каталогов.

index.php

';

Ваш результат должен выглядеть так:


Шаг 10 - Загрузка файла

По мере продвижения к завершению этого урока мы переходим к загрузке файла. Метод начинается с того же кода, что и uploadFile, поскольку он определяет, является ли файл, который мы хотим загрузить, ascii или двоичным binary.

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

Чтобы скачать файл, вам нужно вызвать ftp_get.

Он загружает файл с удаленного сервера на наш локальный компьютер. Он принимает следующий параметр: наш идентификатор соединения, путь и имя файла для сохранения локально (будет перезаписан, если он
уже существует) ($fileTo), местоположение и имя файла на удаленном сервере ($fileFrom) и режим ($mode).

ftp_class.php

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

Примечание: еще раз, убедитесь, что ваши права установлены правильно!

Поскольку теперь мы должны находиться внутри нашей папки с фотографиями photo, мы не добавляем путь к переменной $fileFrom - только имя файла.

index.php

Шаг 11 - Завершение

Чтобы завершить наш класс, давайте добавим магический метод класса __deconstruct. Этот метод закрывает наше соединение, когда ссылка на наш объект больше не существует - возможно страница была закрыта. В любом случае этот код запускается и соединение закрывается. Как правило это хорошая практика включать его в код, хотя это не совсем необходимо.


Заключение

Хорошо что все получилось! Я надеюсь, что вы теперь лучше понимаете, как использовать FTP с PHP. Теперь у вас должны быть необходимые навыки для дальнейшего расширения этого класса для поддержки других распространенных задач, таких как переименование или удаление файлов и папок.

Обязательно сообщите нам, если вы создадите классные PHP FTP-клиенты!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.