Php копирование файлов ftp

Обновлено: 01.07.2024

В этом руководстве наша цель - создать класс 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 определяет область действия переменной. В этом случае это означает, что переменная не может быть доступна из-за пределов класса.

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

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

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

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

Этот метод является 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 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-сервере. Просто перейдите в каталог, чтобы изменить. Просто и мило.

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. Теперь у вас должны быть необходимые навыки для дальнейшего расширения этого класса для поддержки других распространенных задач, таких как переименование или удаление файлов и папок.

Работа с FTP через PHP

Разберём простой пример по работе с FTP через PHP:

<?php
$ftp = ftp_connect("ftp.site.ru", "21", "30"); // Создаём идентификатор соединения (адрес хоста, порт, таймаут)
$login = ftp_login($ftp, "admin", "password"); // Авторизуемся на FTP-сервере
if (!$login) exit("Ошибка подключения");
ftp_mkdir($ftp, "myrusakov"); // Создаём директорию
ftp_chdir($ftp, "myrusakov"); // Заходим в созданную директорию
ftp_put($ftp, "image.bmp", "image.bmp", FTP_BINARY); // Загружаем image.bmp на FTP в бинарном режиме
ftp_put($ftp, "new_doc.xml", "doc.xml", FTP_BINARY); // Загружаем doc.xml (делаем имя new_doc.xml) на FTP в бинарном режиме
$files = ftp_nlist($ftp, "."); // Получаем список файлов из текущей директории
for ($i = 0; $i < count($files); $i++) echo $files[$i]."<br />"; // Выводим все полученные файлы
>
ftp_get($ftp, "local.xml", "new_doc.xml", FTP_BINARY);
ftp_close($ftp);
?>

Код хорошо прокомментирован, поэтому, что происходит, думаю, Вы понимаете. Безусловно, это лишь часть функций, самые важные. А с полным списком Вы можете ознакомиться в справочнике.

Не могу сказать, что я очень часто работаю с FTP через PHP, но уметь это необходимо любому разработчику, поэтому и написал эту статью.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 3 ):

привет,добавил сайт на хостинг,сайт на php.набрал в браузере адрес сайта,вместо сайта вышел html код станицы index.php.в чем здесь проблема?спасибо.

Так и должен был выйти HTML-код, а если помимо него выводится ещё и PHP, то проверьте: поддерживает ли хостинг PHP.

А почему XML-файлы передаются в бинарном режиме?

Я хочу сделать форму, в которой вы можете заполнить FTP-сервер входа и получить возможность загрузить ZIP-файл. Скрипт работает отдельно от последней части (разархивировать файл). Я хочу выполнить разархивирование загруженного файла. Кто-нибудь знает, в чем проблема? TIA

2 ответа

ZipArchive не поддерживает оболочки URL.

И в любом случае ваш код не имеет особого смысла:

Сначала вы загружаете $localfile на FTP-сервер как /htdocs/file.zip

А потом вы пытаетесь открыть /htdocs/file.zip , как бы локальный файл

Но такого локального файла не существует.

А затем вы пытаетесь извлечь этот несуществующий файл на FTP-адрес. И это не поддерживается.

См. ZipArchive :: open (): поддержка оберток потока. Речь идет о open , но если open не поддерживает оболочки, extactTo тоже не будет (поддерживать это намного сложнее). См. комментарий cmb:

В любом случае, ZipArchive :: open () не должен принимать какой-либо поток URL-адреса оболочки, но только реальные пути к файлам. Его документация не скажите иначе, и справочная страница "Поддерживается Протоколы и оболочки »[1]:

| PHP имеет множество встроенных оболочек для различных URL-стилей. | протоколы для использования с функциями файловой системы [. ]

Однако ZipArchive :: open () не является функцией файловой системы для этого имеет значение.

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

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

Вы хотели загрузить ZIP-файл на FTP-сервер и распаковать его там. Просто невозможно распаковать ZIP-файл на ZIP-сервере.

Вы хотели распаковать локальный ZIP-архив на FTP-сервер. Хотя может показаться, что это возможно с использованием оболочки URL в вызове ZipArchive:extractTo , это не так. Как я показал выше. Также нет другого способа извлечь локальный ZIP-файл на FTP-сервер с помощью простого однострочника в PHP.

Все, что вы можете сделать, - это распаковать ZIP-файл локально (на веб-сервере); а затем загрузите файл за файлом на FTP-сервер.

Создайте временную папку и извлеките ( ZipArchive::extractTo ) ZIP-архив туда.

Загрузите временную папку на FTP-сервер.

Удалить временную папку.

Также обратите внимание, что вы загружаете файл в режиме ASCII. Формат ZIP является двоичным. Загружая двоичный файл в режиме ASCII, вы его повредите.

Фактически ни один из FTP-клиентов не может извлекать или распаковывать архивные файлы на FTP-сервере, поскольку в FTP нет такой команды. Однако net2ftp делает это возможным, загружая архивный файл с вашего веб-сервера, извлекая файлы с их сервера и затем загружая все файлы обратно на ваш сервер. Следовательно, вы можете заметить, что net2ftp занимает довольно много времени для завершения загрузки, если в архиве тысячи файлов.

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

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

Создание на сервере папки


Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Возврат списка директории

Детали учебника

Программа: PHP 5+

Требования: и сервер FTP

Сложность: средняя

Примерное время выполнения: 30 минут

скачать исходники

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

Этот вид класса можно применять в нескольких случаях. Парой сценариев могут быть:

Автоматизирование выгрузки изображений, таких как галерея, на вебсайт клиента (в идеале – в сочетании с моей подсказкой по изменению размера изображения);

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

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

Что такое FTP?

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

FTP, или File Transfer Protocol – это, по определению Wikipedia: "Стандартный сетевой протокол, используемый для копирования файла с одного хоста на другой через основанную на TCP/IP сеть, такую, как Интернет."

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

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

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

В следующем шаге мы создадим «скелет» класса. Когда он будет готов, вы сможете пойти далее и попробовать проделать каждый этап.

php ftp

Шаг 2 – Устанавливаем класс

Сильной стороной объектно-ориентированного программирования (Object-Oriented Programming (OOP)) является то, что оно дает сложному коду легкий в использовании интерфейс. Создавая класс — считайте класс шаблоном — вы можете инкапсулировать (герметизировать) данные, что является простым жаргонным словом для термина, относящегося к сокрытию данных. Затем можно опять использовать этот класс снова и снова без нужды в переписывании частей кода. Вместо того вам нужно всего лишь вызывать подходящие методы (термин “method” – это то же самое, что function).

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

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

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

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

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

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

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

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

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

Будучи внутри класса, $this относится к самому объекту.

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

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

Шаг 5 – Соединение

На этом этапе мы добавим метод connect. Он позволит нам соединяться с сервером FTP.

public function connect ( $server , $ftpUser , $ftpPassword , $isPassive = false ) $loginResult = ftp_login ( $this -> connectionId , $ftpUser , $ftpPassword ) ; // *** Устанавливает пассивный режим вкл/выкл (on/off) (по умолчанию стоит off) $this->logMessage(' Попытка подключения к ' . $server . ' для пользователя ' . $ftpUser, true); $this->logMessage(' Соединение к ' . $server . ' , для пользователя ' . $ftpUser ) ;

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

Первая строка кода открывает соединение FTP с отдельным сервером при помощи ftp_connect. Мы сохраняем свое соединение в переменную класса, $connectionId, описанную выше.
Код ftp_login записывает нас в отдельное соединение, передавая наш connection id, имя пользователя и пароль.

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

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

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

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

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

Читайте также: