我正在尝试通过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);
?>
答案 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的差异。