php - 从服务器下载的 .exe 文件损坏

标签 php file-upload download

首先:我是一名低级网页设计师,只知道足够危险的 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/

相关文章:

php - 如何实现多人浏览器游戏?

php - 使用 Symfony PHP 实现三层架构

java - 需要使用Java获取网页的绝对路径

Delphi XE ISAPI WebBroker 文件上传

javascript - 无法在服务器中打开上传的文件

download - 如何启用Chrome :webrtc-internals in electron to download webrtc getstats files

c#-4.0 - 向本地播放器提供 mp3,不显示 mp3 的位置

php - 从 PHP 的 while 循环中获取随机数组

java - 如何使用Codeigniter 3从java网站获取Json数据?

java - 如何在 ICEfaces 中选择上传文件的文件名?