Почему я могу получить размер файла и метку времени по FTP, но не могу получить реальный файл?

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

  • Сервер, с которого я пытаюсь получить данные, требует FTP через явный TLS
  • Я получаю ту же ошибку (ы) с обоими FTP_BINARY а также FTP_ASCII в ftp_fget()
  • Сервер, с которого приходит файл, — UNIX

Если я обновляю страницу каждые несколько часов, ошибки, которые я получаю от PHP, отличаются без изменений в коде

Ошибка 1: ‘ftp_fget (): режим передачи установлен в BINARY если ftp_get является двоичным
или это ‘ftp_fget (): режим передачи установлен в ASCII’ если ftp_get это ASCII

Ошибка 2: ‘ftp_fget (): вход в пассивный режим (12.345.678.90.12.34)’

О вышеупомянутых ошибках я прочитал, что режим PASV, являющийся ЛОЖНЫМ, является тем, что вызывает ошибку 1, поэтому я думаю, что переключение между ошибками для режима pasv работает или не работает. Не позитивно, хотя.

<?php

$server = "12.345.678.90";
$local_file = 'inv3.txt';
$file = 'inventory-alp.txt';

$con = ftp_ssl_connect($server,21) or die("Could not connect to $server");
ftp_login($con,"xxxxxx","xxxxxx") or die("Could not login");
ftp_pasv($con,true);

$fsize = ftp_size($con, $file); // works

if ($fsize != -1)
{
echo "</br>$file is $fsize bytes.</br></br>";
}
else
{
echo "</br>Error getting file size.</br></br>";
}

$lastchanged = ftp_mdtm($con, $file); //works

if ($lastchanged != -1)
{
echo date("F d Y H:i:s.",$lastchanged)."</br></br>";
}
else
{
echo "Could not get last modified</br></br>";
}if (ftp_get($con,$local_file,$file,FTP_ASCII)) //fails
{
echo "successfully written to $local_file";
}
else
{
echo "There was a problem while downloading $file to $local_file";
}$var = error_get_last();
echo '<pre>';
var_dump($var);
echo '</pre>';

ftp_close($con);
?>

РЕДАКТИРОВАТЬ 1: Решение: я не смог получить доступ к тому, что мне нужно, чтобы изменить настройки брандмауэра и тому подобное в php. Хотя это не верный ответ, я заставил его работать, и это относительно просто. Я закончил работать через WINSCP, имея возможность подключиться к серверу в макете типа filezilla, а затем сохранить URL сессии. Все, что я сделал, это получил доступ к сохраненному сеансу в .exe и смог установить соединение через полчаса.

1

Решение

То, что указал Мартин, очень верно, команды SIZE и MDTM запускаются синхронизированными только через основное соединение команд FTP. Передача файлов данных и, как правило, список каталогов (кроме случаев, когда используется MLST / MSLD), требует отдельного соединения, соединения данных, которое согласовывается клиентом и сервером через управляющее соединение с помощью ряда команд, прежде всего PORT и PASV.

Не вдаваясь в тонну деталей (есть ссылка на наш технический документ позже), когда Клиент & Сервер согласовывает условия подключения к данным, одна из конечных точек сообщит другой конечной точке конкретный IP-адрес и номер порта для подключения. Одна конечная точка будет прослушивать и ожидать подключения от другой конечной точки. Это прекрасно работает, если перед конечной точкой нет брандмауэра, который ожидает входящего соединения. Если сеанс клиент / сервер выполняется в активном режиме, сервер будет активно подключаться к клиенту по IP-адресу / порту, который был получен сервером от клиента в форме команды PORT. В пассивном режиме сервер будет пассивно ожидать подключения клиента по IP / порту, который был отправлен сервером клиенту в ответ на команду PASV, отправленную клиентом на сервер.

Опять же, брандмауэры, как правило, блокируют FTP-соединения для передачи данных, если только брандмауэр не выполняет активную FTP-трансляцию по протоколу FTP или если на брандмауэре не была настроена переадресация портов, а набор пассивных портов не был открыт и специально направлен на конечную точку.

Поэтому проверьте настройки брандмауэра на клиенте, если вы хотите использовать режим Active / Port; проверьте настройки брандмауэра на сервере, если вы хотите использовать режим Passive / PASV.

Вот ссылка на наш технический документ, в котором изложены основы FTP / PASV / PORT, надеюсь, он поможет вам в вашей проблеме.

http://www.webdrive.com/wp-content/uploads/FTP_Explained1.pdf

Удачи!

Майкл

3

Другие решения

С протоколом FTP вполне возможно, что вы можете получить размер файла и метку времени изменения (используя SIZE а также MDTM команды соответственно), но не сам файл.

SIZE а также MDTM Команды используют только управляющее соединение FTP.

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

Смотрите (мою) статью о Режимы FTP-соединения для более подробной информации и типичных проблем с подключениями к данным.


Как правило, виновником будет брандмауэр на вашем веб-сервере. Если у вас есть SSH / терминальный доступ к веб-серверу, можете ли вы подключиться с него к FTP-серверу?

Другая возможность — неправильно настроенный FTP-сервер. Является ли IP-адрес в «Ошибка 2» маршрутизируемым с вашего веб-сервера? (= Это реальный IP-адрес, к которому вы подключаетесь?)


Вряд ли это связано с режимом ASCII / BINARY. Сообщения, которые вы получаете (Режим передачи установлен на …) являются сообщениями о состоянии, а не сообщениями об ошибках. Они не связаны с вашей проблемой. Это действительно странно, что у вас нет другого сообщения / ошибки.


Вы можете попробовать использовать активный режим вместо пассивного.

ftp_pasv($con, false);

Но обычно активный режим более проблематичен.

2