Я работаю над этим около 20 часов и мне нужна серьезная помощь. Я могу получить размер файла и метку времени для файла, но я не могу получить данные.
FTP_BINARY
а также FTP_ASCII
в ftp_fget()
Если я обновляю страницу каждые несколько часов, ошибки, которые я получаю от 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 и смог установить соединение через полчаса.
То, что указал Мартин, очень верно, команды 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
Удачи!
Майкл
С протоколом FTP вполне возможно, что вы можете получить размер файла и метку времени изменения (используя SIZE
а также MDTM
команды соответственно), но не сам файл.
SIZE
а также MDTM
Команды используют только управляющее соединение FTP.
Для передачи файлов (или списка каталогов) требуется отдельное подключение для передачи данных. И, вероятно, что-то препятствует открытию соединения для передачи данных.
Смотрите (мою) статью о Режимы FTP-соединения для более подробной информации и типичных проблем с подключениями к данным.
Как правило, виновником будет брандмауэр на вашем веб-сервере. Если у вас есть SSH / терминальный доступ к веб-серверу, можете ли вы подключиться с него к FTP-серверу?
Другая возможность — неправильно настроенный FTP-сервер. Является ли IP-адрес в «Ошибка 2» маршрутизируемым с вашего веб-сервера? (= Это реальный IP-адрес, к которому вы подключаетесь?)
Вряд ли это связано с режимом ASCII / BINARY. Сообщения, которые вы получаете (Режим передачи установлен на …) являются сообщениями о состоянии, а не сообщениями об ошибках. Они не связаны с вашей проблемой. Это действительно странно, что у вас нет другого сообщения / ошибки.
Вы можете попробовать использовать активный режим вместо пассивного.
ftp_pasv($con, false);
Но обычно активный режим более проблематичен.