首先:我是一个低级的网页设计师,他知道只有足够的PHP是危险的,而且对服务器管理来说就足够了。除非你很清楚,否则我可能不会理解你!
设置:我已经建立了一个网站,客户端将文件上传到特定目录,这些文件通过php提供,供用户下载。这些文件通常是50MB以上的可执行文件。客户端不希望他们压缩,因为他们觉得他们的用户不够精明,无法解压缩。我正在使用下面的php强制下载对话框并隐藏文件所在的目录。
这是Linux服务器,如果这有所不同。
问题:用户尝试下载后,某个文件会损坏。它是一个可执行文件,但是当它被单击时,会打开一个空白的DOS窗口。下载之前的原始文件打开完美。还有其他几个类似的文件经过相同的下载程序,所有这些都可以正常工作。
我尝试过的事情:我尝试上传压缩后的文件,然后在服务器上解压缩以确保它在上传过程中没有损坏,并且没有运气。
我还将原始文件的二进制代码与下载的文件进行了比较,这些文件不起作用,它们完全相同(因此php不会意外地在文件中插入任何内容)。击>
我的downloadFile函数中的标题是否有问题?我真的不确定如何解决这个问题...
这是下载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;
}
}
ETA Additonal Info: - 工作/非工作文件的测试已在同一台机器上完成 - 如果它有任何区别,原始文件有一个自定义图标。下载后,该文件具有通用空白文档图标。
添加个人信息:我认为这一点非常重要! 我刚尝试直接下载文件(绕过触发上面下载功能的下载链接)。如果我只是通过它的URL下载文件并以这种方式下载它,下载的文件就可以了。所以我认为它必须与下载功能有关。但是什么??
3/17主要修正 - 已解决 - 所以今天早上醒来,我突然意识到我可能正在比较错误的文件。 (我已经将它们重新保存为二进制文本,然后比较它们。我没有意识到比较程序将采用并比较实际的exe文件)。今天早上我尝试比较实际的exe文件,是的区别。有一行PHP代码被注入到文件的第一行。我调整了php,问题得到解决。 (它来自if / else语句,在我引用的代码中定义了teh $ filenamereplace变量)。再次感谢您的帮助,并抱歉误导您坚持文件内容相同!
答案 0 :(得分:3)
也许他们在上传时已损坏。如果您通过FTP以ASCII模式而不是BINARY传输它们,则会发生这种情况。
答案 1 :(得分:3)
“我还将原始文件的二进制代码与不起作用的下载文件进行了比较,并且它们完全相同(因此php不会意外地在文件中插入任何额外内容)。”
如果确实如此,则问题必须出在exe下载后如何启动。它肯定不是你的PHP代码的问题。