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

4

我正在尝试通过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);
?>

1
检查代码中的空格并将其删除。通常是通过进行缩进。此外,当执行的代码没有直接写入页面内容时,最好不要关闭php标签(?>)。 - Vladimir
1
确保在 <?php 之前或 ?> 之后没有换行符或空格。发送文件后,最好使用 exit; 来确保安全。 - gen_Eric
您可以检查编码,例如在一侧使用UTF-8,在另一侧使用ISO。如果您的PHP脚本不在相同的编码中,则可能会导致一些校验和错误。 - Alexandre GUIDET
2个回答

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提供的良好实践建议


0

我曾经遇到过类似的问题,通过fread下载PDF文件时出现了问题(使用readfile也会出现相同的问题)。最终,我解决了这个问题,方法是关闭应用程序的调试输出,而在我的情况下,这个应用程序是WordPress。我将WP_DEBUG设置为true,导致MD5出现差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接