我使用以下代码在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
答案 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']已设置。