首先:我是一名低级网页设计师,只知道足够危险的 PHP,并且对服务器管理了解得足够多,好吧,什么都不是。除非你很清楚,否则我可能不会理解你!
设置:我已经建立了一个网站,客户端将文件上传到特定目录,这些文件通过 php 可供用户下载。这些文件通常是超过 50MB 的可执行文件。客户不希望它们被压缩,因为他们觉得他们的用户不够聪明,无法解压缩它们。我正在使用下面的 php 强制下载对话框并隐藏文件所在的目录。
它是 Linux 服务器,如果有区别的话。
问题:某个文件在用户尝试下载后损坏。它是一个可执行文件,但单击它时,会打开一个空白的 DOS 窗口。下载前的原始文件可以完美打开。还有其他几个类似的文件通过完全相同的下载过程,所有这些都工作得很好。
我尝试过的事情:我尝试上传压缩文件,然后在服务器上解压缩以确保它在上传过程中没有损坏,但没有成功。
我还比较了原始文件的二进制代码和无法正常工作的下载文件,它们完全相同(因此 php 不会意外地向文件中插入任何额外内容)。罢工>
这可能是我的 downloadFile 函数中的 header 有问题吗?我真的不知道如何解决这个问题......
这是下载的 php,如果它是相关的($filenamereplace 在别处定义):
downloadFile("../DIRECTORY/files/$filenamereplace","$filenamereplace");
function downloadFile($file,$filename){
if(file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
@ flush();
readfile($file);
exit;
}
}
预计到达时间附加信息: - 工作/非工作文件的测试已在同一台机器上完成 - 如果有任何区别,原始文件有一个自定义图标。下载后,该文件有一个通用的空白文档图标。
附加信息:我认为这很重要! 我只是尝试直接下载文件(绕过触发上面下载功能的下载链接)。如果我通过转到其 url 并以这种方式下载文件来下载文件,则下载的文件 WORKS.所以我认为它一定与下载功能有关。但是什么??
3/17 重大更正 — 并已解决 — 所以我今天早上醒来,突然意识到也许我比较的文件是错误的。 (我将它们重新保存为二进制文本,然后比较了它们。我没有意识到比较程序会获取并比较实际的 exe 文件)。今天早上,我尝试比较实际的 exe 文件,有差异。有一行 php 代码被注入(inject)到文件的第一行。我调整了php,问题就解决了。 (它来自在我引用的代码中定义 teh $filenamereplace 变量的 if/else 语句)。再次感谢您的所有帮助,很抱歉误导您坚持认为文件的内容是相同的!
最佳答案
“我还比较了原始文件的二进制代码和无法正常工作的下载文件,它们完全相同(因此 php 不会意外地在文件中插入任何额外内容)。”
如果这是真的,那么问题一定出在 exe 下载后的启动方式上。这肯定不是您的 PHP 代码的问题。
关于php - 从服务器下载的 .exe 文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2458134/