即使文件下载成功,PHP FTP代码也会失败

时间:2015-11-02 01:33:19

标签: php ftp

我使用以下代码在PHP中通过FTP下载文件:

$fp = fopen($local_file, 'w+');
$conn_id = ftp_connect($host);
$login_result = ftp_login($conn_id, $user, $pass);
$ret = ftp_nb_fget($conn_id, $fp, $remote_file, FTP_BINARY);

while ($ret == FTP_MOREDATA) {
    $ret = ftp_nb_continue($conn_id);
}

if ($ret != FTP_FINISHED) {
    echo "<span style='color:red;'><b>There was an error downloading the file!</b></span><br>";
    logThis("log.txt", date('h:i:sa'), "ERROR DOWNLOADING FILE!");
    exit();
}

fclose($fp);

<<php code continues below this....>>

此代码似乎工作正常。下载文件,文件的MD5哈希值在下载之前与另一台服务器上的文件的哈希值匹配。所以下载完成了。

无论如何,使用上面的代码,即使文件成功下载,它也会触及if($ ret!= FTP_FINISHED)条件中的代码。

如果文件下载正常,为什么FTP_FINISHED不正确?

修改

当我在WHILE循环后检查$ ret的值时,脚本完成罚款的次数$ ret = 1以及脚本失败的次数$ ret = 0

但是,有时脚本会因为$ ret = 0而无法正确下载文件,这可以通过MD5比较来确认。

此外,0或1不是应从这些命令返回的值。官方PHP文档提供了三个可能的返回值,它们是FTP_FAILED或FTP_FINISHED或FTP_MOREDATA

2 个答案:

答案 0 :(得分:1)

我想到了一个解决方案。由于文件确实正确下载,由原始源(我们有)的MD5检查确定,我可以这样修改代码:

if ($ret != FTP_FINISHED) {

$localMD5 = md5_file($local_file);

    if($localMD5 != $remoteMD5){
        echo "<span style='color:red;'><b>There was an error downloading the file!</b></span><br>";
        logThis("log.txt", date('h:i:sa'), "ERROR DOWNLOADING FILE!");
        exit();
    }
}

在大多数情况下,脚本按预期完成,因此这段代码永远不会运行。但是,如果出现上述错误并运行此代码,则可以验证文件的MD5哈希值,并且只有在与原始源文件的MD5不匹配时才运行错误代码。如果MD5匹配,那么下载成功无论如何,所以错误代码不应该运行

答案 1 :(得分:0)

编辑:

我的第一个解决方案不正确。检查下面的评论后,我必须说你的代码是正确的,问题可能是“upload_max_size”和“post_max_size”值。

请参阅此处“Upload large files to FTP with PHP”,主要在此处:“Changing upload_max_filesize on PHP

因此,建议的解决方案是将其添加到.htaccess文件中:

php_value upload_max_filesize 2G
php_value post_max_size 2G

或者,如果服务器是您的(专用),请在php.ini中设置它们(您需要重新启动服务器以使更改生效)。

您可能还会在php.net中找到有用的post_max_size信息。我特别感到有趣:

  

如果发布数据的大小大于post_max_size,则为$ _POST和   $ _FILES superglobals是空的。这可以通过各种方式进行跟踪,   例如通过将$ _GET变量传递给处理数据的脚本,   即,然后检查是否   $ _GET ['processed']已设置。