为什么我可以使用FTP获取文件大小和时间戳但无法检索实际文件?

时间:2015-01-21 12:59:25

标签: php ftp ftps

我现在已经工作了大约20个小时,我需要一些重要的帮助。我能够获取文件的文件大小和时间戳,但我无法真正获取数据。

  • 我正在尝试从中获取数据的服务器需要FTP而不是显式TLS
  • 我在FTP_BINARY
  • 中收到FTP_ASCIIftp_fget()同样的错误
  • 文件来自的服务器是UNIX

如果我每隔几个小时刷新页面,那么我从PHP获得的错误是不同的,代码没有变化

错误1:'ftp_fget():如果ftp_get是二进制,则传输模式设置为BINARY 或者它是'ftp_fget():如果ftp_get是ascii

,则传输模式设置为ASCII'

错误2:'ftp_fget():进入被动模式(12.345.678.90.12.34)'

在上面的错误中我读到PASV模式为FALSE是触发错误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:解决方案:我最终无法访问我需要更改防火墙设置等所需的内容。虽然这不是真正的答案,但我确实让它工作并且相对容易。我最终在WINSCP上运行,能够以filezilla类型布局连接到服务器,然后保存会话url很好。我所做的只是访问.exe中保存的会话,并能够在半小时内建立我的连接。

2 个答案:

答案 0 :(得分:3)

Martin表示非常正确,SIZE和MDTM命令仅在主FTP命令连接上同步运行。传输数据文件,通常也是目录列表(除非使用MLST / MSLD)需要单独的连接,数据连接,由客户端和服务器通过控制连接使用一系列命令协商,最显着的是PORT和PASV。

没有详细介绍(后面有我们白皮书的链接),当客户&amp;服务器协商数据连接的条款,其中一个端点将告诉另一个端点连接的特定IP地址和端口号。一个端点将侦听并等待来自另一个端点的连接。除非在端点前面有等待入站连接的防火墙,否则这种方法很有效。如果客户端/服务器会话在活动模式下运行,则服务器将以PORT命令的形式主动连接回服务器从客户端接收的IP /端口上的客户端。在被动模式下,服务器将被动地等待客户端连接到服务器发送到客户端的IP /端口,以响应客户端发送到服务器的PASV命令。

同样,防火墙倾向于阻止FTP数据连接,除非防火墙执行主动FTP NAT,或者除非在防火墙上设置了端口转发并且已打开一组被动端口并将其路由到端点具体

因此,如果要使用活动/端口模式,请检查客户端上的防火墙设置;如果要使用Passive / PASV模式,请检查服务器上的防火墙设置。

这是我们白皮书的链接,其中概述了FTP / PASV / PORT的基础知识,希望它可以帮助您解决问题。

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

最好的运气!

迈克尔

答案 1 :(得分:2)

使用FTP协议,您完全有可能获得文件大小和修改时间戳(分别使用SIZEMDTM命令),但不能获取文件本身

SIZEMDTM命令仅使用FTP控制连接。

虽然文件传输(或目录列表)需要单独的数据连接。并且可能存在阻止数据连接被打开的东西。

有关详细信息和数据连接的典型问题,请参阅FTP connection modes上的(我的)文章。


通常,罪魁祸首就是您的网络服务器上的防火墙。 如果您有对Web服务器的SSH /终端访问权限,是否可以从它连接到FTP服务器?

另一种可能性是配置错误的FTP服务器。 IP地址是&#34;错误2&#34;从您的Web服务器路由? (=它是您连接的真实IP地址吗?)


这不太可能与ASCII / BINARY模式有关。您收到的消息(传输模式设置为... )是状态消息,而不是错误消息。它们与您的问题无关。你没有其他消息/错误确实很奇怪。


您可以尝试使用主动模式,而不是被动模式。

ftp_pasv($con, false);

但通常活动模式更有问题。