通过PHP脚本下载文件导致错误/不同的md5校验和 - 为什么?

时间:2011-11-23 15:53:42

标签: php download md5

我正在尝试通过PHP实现间接下载。在客户端,我使用md5验证下载的文件是否正确。

当我直接下载文件(http://server/folder/file.apk)时,我获得与文件系统相同的md5校验和,但是当我通过PHP脚本(http://server/some_page.php)下载时,我得到一个完全不同的校验和。为什么呢?

这是我的PHP脚本:

<?php
$name_file="test2.apk";
$path="/home/user/public_html/apk/"; 
$dimension_file=(string)filesize($name_file);

header("Content-Type: application/vnd.android.package-archive ; name=".$name_file);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$dimension_file);
header("Content-Disposition: inline; filename=".$name_file);
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: private");
header("Pragma: public");

readfile($path.$name_file);
?>

2 个答案:

答案 0 :(得分:1)

我发现了错误:

 $name_file="test2.apk";
 $path="/home/user/public_html/apk/"; 
 $dimension_file=(string)filesize($name_file); //<-- HERE! --- 

我只使用文件名而不是使用完整路径来检索大小

filesize($name_file) ---> filesize( $path . $name_file) 

隐藏了错误
header("Content-Type: application/vnd.android.package-archive"); 

并将php错误响应添加到下载文件的内容中。

所以我建议谁有这样的问题,在调试时评论“Content-Type”,看看php代码中是否有一些错误,以及当所有代码似乎工作时重新启用“Content-Type”报头中。

之前的代码中的服务器空间
readfile($path.$name_file);

对校验和没有影响

感谢Vladimir和Rocket的良好练习提示

答案 1 :(得分:0)

我在通过fread下载PDF文件时遇到了类似的问题(虽然readfile提出了同样的问题)。我最终的问题是通过关闭应用程序的调试输出来解决的 - 在我的例子中是Wordpress。我将WP_DEBUG设置为true,这导致了MD5的差异。