За последние 24 часа нас посетил 17601 программист и 1723 робота. Сейчас ищут 1690 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем ugg555, 6 сен 2017.

Метки:
  1. ugg555

    ugg555 Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    10
    Симпатии:
    0
    Здравствуйте!
    Подключился к серверу ftp, получается сменить директорию, а вот список файлов в этой директории не читает.
    Получаемый массив пуст.
    В чем может быть причина ?

    Пробую на другом FTP - все нормально.

    PHP:
    1. <?php
    2.     $ftp_server = ""; //Сервер FTP
    3.     $ftp_user = ""; // Пользователь
    4.     $ftp_pass = ""; //Пароль
    5.     $ftp_dir = "/Нужная/Папка/"; //Директория на FTP
    6.  
    7.     $conn_id = ftp_connect($ftp_server, 21, 60) or die("Не удалось установить соединение с $ftp_server");
    8.  
    9.     if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {
    10.         $mes_001 = "Произведен вход на $ftp_server под именем $ftp_user\n";
    11.  
    12.                 echo "Текущая дериктория: <b>".ftp_pwd($conn_id). "</b><br>"; // Текущая дериктория
    13.  
    14.                 if (ftp_chdir($conn_id, $ftp_dir)) {
    15.  
    16.                     echo "Новая текущая директория: <b>" . ftp_pwd($conn_id) . "</b><br>\n";
    17.                     //Список файлов
    18.                     //получить содержимое текущей директории
    19.  
    20.                     $contents = ftp_nlist($conn_id, ftp_pwd($conn_id));
    21.  
    22.                     if(is_array($contents)){
    23.                         foreach($contents as $key => $value)
    24.                         {
    25.                             echo "[$key] ", $value, "<br>";
    26.                         }
    27.                     }
    28.                     else {
    29.                         echo "Не массив!";
    30.                     }                                
    31.  
    32.                 }
    33.                 else {
    34.                     echo "Не удалось сменить директорию\n";
    35.                 }
    36.  
    37.             }
    38.             else {
    39.                 echo "Не удалось войти под именем $ftp_user\n";
    40.             }
    41. ?>
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в невозможности установить соединение для передачи данных

    он просто вполне возможно имеет возможность установить соединение для передачи данных
     
  3. ugg555

    ugg555 Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    10
    Симпатии:
    0
    Соединение установлено!
    Сработало бы строка 7 кода ( die("Не удалось установить соединение с $ftp_server");)
    Так же я мог поменять директорию (перейти в нужную папку).

    Думаю дело в самом FTP.
    Странно, через браузер могу зайти на этот ftp.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Давай ты перед тем как что-то утверждать будешь хотя бы немного в этом разбираться. У тебя ФТП работает по паре 20-21 портов. Когда ты подключаешься к фтп-серверу - у тебя устанавливается Контрольное соединение по 21 порту - то, по которому пересылаются команды. Когда ты выполняешь ряд команд - получение листинга, скачивание файла и тому подобные, требующие обмена данными, выходящими за рамки аргументов команд - обмен происходит по второму соединению, инициированному по 20 порту. Вот это соединение у тебя и не установлено. Его может резать фаервол а может просто не быть обратного маршрута. Более точно сказать однозначно нельзя, потому как - ты удивишься наверное но - собственно обмен данными по фтп может происходить не только в бинарном или текстовом режиме, но и в пассивном или активном, а у этих режимов свои заморочки на установку соединения, и, следовательно, свои подводные камни и свои методы тушения пердака, когда что-то не работает.

    Итак:
    сработала бы, если б не было установлено Контрольное соединение.

    смог, потому что установлено Контрольное соединение. Иначе бы ты умер на строке 7.

    да, дело в фтп. А если быть точным - в твоём фтп-клиенте.

    Потому что фтп-клиент в браузере - явление более высокоуровневое. Все подводные камни разбиваются где-то в фоне, чтоб пользователю оставалось только тыкать в ссылки и грузить порнуху. Тебе нужно довести свой фтп-клиент по качеству до уровня браузерного сочетанием функций, доступных в разделе фтп языка пхп. В принципе не такая уж и сложная задача.
     
    mahmuzar и askanim нравится это.
  5. ugg555

    ugg555 Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    10
    Симпатии:
    0
    Спасибо за развернутый ответ!
     
  6. ugg555

    ugg555 Новичок

    С нами с:
    6 сен 2017
    Сообщения:
    10
    Симпатии:
    0
    Разобрался!
    Нужно включить пассивный режим.

    PHP:
    1. // включение пассивного режима
    2. ftp_pasv($conn_id, true)