设置:我已经建立了一个网站,客户端将文件上传到特定目录,这些文件通过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信息:
– 已在同一台机器上完成工作/非工作文件的测试
– 如果它有任何区别,原始文件有一个自定义图标.下载后,该文件具有通用空白文档图标.
Additonal信息:我认为这一点非常重要!
我只是尝试直接下载文件(绕过触发上面的下载功能的下载链接).如果我只是通过它的URL下载文件并以这种方式下载它,下载的文件就是WORKS.所以我认为它必须与下载功能有关.但是什么?
3/17主要修正 – 并已解决 –
所以今天早上醒来,我突然意识到我可能正在比较错误的文件. (我已将它们重新保存为二进制文本,然后对它们进行比较.我没有意识到比较程序将采用并比较实际的exe文件).今天早上我尝试比较实际的exe文件,但有一点不同.有一行PHP代码被注入到文件的第一行.我调整了PHP,问题得到解决. (它来自if / else语句,在我引用的代码中定义了teh $filenamereplace变量).再次感谢您的帮助,并抱歉误导您坚持文件内容相同!