我使用以下代码通过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[已处理的']已设置。