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


PHP FTP code fails, even though file is downloaded successfully

我使用以下代码通过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

我想到了一个解决方案。由于文件确实下载正确,这是由原始源(我们确实有)的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匹配,那么下载无论如何都是成功的,所以错误代码不应该运行

编辑:

我的第一个解决方案不正确。在检查了你下面的评论后,我必须说你的代码是正确的,问题可能出在"upload_max_size"answers"post_max_size"值上。

请参阅此处的"使用PHP将大文件上传到FTP",主要内容如下:"在PHP上更改Upload_max_filesize"

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

php_value upload_max_filesize 2G
php_value post_max_size 2G

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

你也可以在php.net中找到有用的post_max_size信息

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