2010-01-12 91 views
3

我有一个脚本,我必须下载一些文件并确保一切正常,我正在比较MD5校验和。在PHP中使用CURL下载后错误的MD5校验和 - file_get_contents工作正常

我发现使用CURL下载时,校验和不正确。下面的脚本演示了这一点。它下载Google徽标并比较校验和。

$url = 'http://www.google.com/intl/en_ALL/images/logo.gif'; 

echo md5_file($url)."\n"; 

$path = 'f1'; 
file_put_contents($path, file_get_contents($url)); 
echo md5_file($path)."\n"; 


$path = 'f2'; 
$out = fopen($path, 'wb'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_FILE, $out); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_exec($ch); 
curl_close($ch); 
echo md5_file($path)."\n"; 

输出为:

e80d1c59a673f560785784fb1ac10959 
e80d1c59a673f560785784fb1ac10959 
d83892759d58a1281e3f3bc7503159b5 

前两个是正确的,得到卷曲产生的结果(他们的MD5校验当我下载用firefox标志匹配)也不行。

任何想法如何解决?

感谢您的帮助

UPDATE:

有趣的是下面的代码工作得很好,并产生正确的输出。当保存到文件时,问题似乎只存在。不幸的是我必须直接保存到一个文件,因为我正在下载的文件可能会变得相当大。

$path = 'f3'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
file_put_contents($path, curl_exec ($ch)); 
echo md5_file($path)."\n"; 
curl_close ($ch); 
+1

我得到'从http://windows.php.net/download/的PHP 5.3.1构建e80d1c59a673f560785784fb1ac10959'三次。你使用什么版本的PHP和curl版本? – VolkerK 2010-01-12 17:32:12

+0

我在PHP 5.2.10上,我也试过在另一台机器上安装了PHP 5.2.6 同样的结果 – MarcS 2010-01-12 17:37:18

+0

但是从哪里安装? (也许:怎么样?) – VolkerK 2010-01-12 17:58:19

回答

1

你错过了一个fclose($out),这可以解释md5_file看到一个不完整的文件。

+0

感谢您的回答 - 不幸的是,这不是。我尝试在fclose($ out)中投入,但它不起作用 – MarcS 2010-01-12 17:55:37

+0

在我玩耍的时候,我不小心粘贴了fclose($ out); FCLOSE($出);在代码中。无论出于什么原因关闭它两次使它工作。我完全不知道为什么会这样。 – MarcS 2010-01-12 18:02:19

1

尝试添加

curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

要将卷曲选项