Отказ от ответственности : Первое, что вы должны знать, это то, что RFC959 было написано через некоторое время после того, как FTP стал популярным, и все еще существует неработающее программное обеспечение, основанное на отсутствии спецификации, существовавшей ранее. (и через некоторое время) RFC959 был опубликован. Многие старые (и более стабильные) библиотеки FTP имеют специальную обработку для некоторых серверов, чтобы убедиться, что она работает так, как вам нужно, в 99,9% случаев. Это особенно часто встречается при обработке расширений протокола FTP.
В остальной части моего ответа предполагается, что сервер совместим с RFC959.
Также имейте в виду, что обход высокоуровневого управления запросами / ответами вашей клиентской библиотеки FTP означает, что вам нужно будет заново реализовать часть этой библиотеки самостоятельно. Это означает, что вы должны быть довольны спецификацией, так как вам нужно обратиться к ней. Где это возможно, я буду ссылаться на соответствующие разделы, чтобы вы могли обойти.
В одном случае я настоятельно рекомендую вам отладить свои проблемы, войдя в клиентскую библиотеку FTP-клиента PHP, а не реализовав все это самостоятельно. Возможно, вы действительно должны запросить, чтобы библиотека выводила все команды, которые она использует. После всего этого я все равно проведу вас через процедуру, чтобы помочь диагностировать вашу проблему.
Управление FTP-соединением для передачи данных является чем-то вроде боли. Это не так просто, как кажется на первый взгляд, если вы хотите поддерживать все необязательные части спецификации. Точный способ передачи файлов в основном зависит от текущего состояния следующих параметров:
- тип данных (раздел 3.1.1): передача файлов, как правило, наиболее безопасна и наиболее эффективна при использовании типа изображения / двоичных данных. Это не значение по умолчанию, и некоторые команды FTP (например, списки каталогов) требуют установки его в ASCII, поэтому убедитесь, что вы всегда устанавливаете его перед передачей.
- структура данных (раздел 3.1.2): файловая структура обычно такая, какая вам нужна, но некоторые старые компьютеры и мэйнфреймы, возможно, придется преобразовывать в этот режим и из него.
- режим передачи (раздел 3.4): чаще всего используется потоковый режим, но блочный режим поддерживает возобновление прерванных передач, а сжатый режим представляет небольшой интерес.
- режим соединения (разделы 3.2 и 3.3): либо клиент, либо сервер могут установить соединение для передачи данных, подключившись к своему партнеру. Это должно быть согласовано с помощью:
- по умолчанию : клиент прослушивает порт 20; или
- пользовательский порт : клиент сообщает серверу, что он указывает на другой порт; или
- пассивный режим : клиент спрашивает, какой порт будет прослушивать сервер.
Обратите внимание на спецификацию, так как некоторые конфигурации позволяют вам поддерживать соединение для передачи данных открытым, в то время как другие могут потребовать, чтобы вы закрыли его (например, потоковый режим). Если подключение для передачи данных уже открыто, вам не нужно повторно подключаться к серверу при каждой передаче.
Все это кажется действительно сложным, но это просто информативно. Это может пригодиться во время отладки. На самом деле есть только два популярных способа передачи файлов по FTP:
Сервер подключается к клиенту через второй порт и отправляет файл с типом данных изображения (двоичный), используя структуру данных файла.
Настройка типа данных (обязательно):
ТИП I
Настройка структуры данных (необязательно, по умолчанию):
STRU F
Настройка режима передачи (необязательно, по умолчанию):
MODE S
Выберите доступный порт (это может быть несколько хитрее, чем вы думаете) и начните прослушивание. Если вы выбрали порт по умолчанию (20), пропустите следующий шаг.
выбрать порт, создать сокет, прослушать выбранный порт.
Сообщите серверу, что мы будем прослушивать данный порт (необязательно, если выбран порт по умолчанию, но это не мешает быть осторожным):
PORT ваш публичный ip-адрес, выбранный порт
Скажите серверу ожидать передачи файла:
STOR remote-file-name
Ожидание входящего соединения с сервера.
Отправить содержимое файла
открыть файл, отправить содержимое, закрыть файл
Закрыть соединение для передачи данных
закрыть сокет.
Клиент подключается к серверу через второй порт и отправляет файл с типом данных изображения (двоичный), используя структуру данных файла.
Настройка типа данных (обязательно):
ТИП I
Настройка структуры данных (необязательно, по умолчанию):
STRU F
Настройка режима передачи (необязательно, по умолчанию):
РЕЖИМ S
Сообщите серверу, что мы будем прослушивать данный порт (обязательно):
PASV
Прочитайте ответ команды PASV
, содержащий IP-адрес и номер порта, который прослушивает сервер.
Скажите серверу ожидать передачи файла:
STOR remote-file-name
Установить соединение:
подключиться к серверу по IP-адресу и номеру порта из PASV
ответ
Отправить содержимое файла
открыть файл, отправить содержимое, закрыть файл
Закрыть соединение для передачи данных
закрыть розетку.
Есть некоторые неудобные проблемы с первым методом, так как выбор порта немного сложен (после использования порта вам нужно подождать некоторое время, прежде чем использовать его снова), и ваш брандмауэр или провайдер может заблокировать входящие соединения на некоторых порты и т. д. Второй способ является наиболее простым и предпочтительным, если только сервер его не отклонит.