如何修复这个破坏文件的PHP下载脚本?
发布时间:2020-12-13 17:38:27 所属栏目:PHP教程 来源:网络整理
导读:我有一个强制下载脚本,可以用PDF和纯文本产生良好的结果,并且对ZIP压缩文件是半正常的(它们在 Windows中工作,而不是在 Linux中工作).但是,应用程序文件和图像都会失败.这些构成了我必须处理的绝大多数文件.正如我在这里看到的关于类似主题的建议,压缩所有下
我有一个强制下载脚本,可以用PDF和纯文本产生良好的结果,并且对ZIP压缩文件是半正常的(它们在
Windows中工作,而不是在
Linux中工作).但是,应用程序文件和图像都会失败.这些构成了我必须处理的绝大多数文件.正如我在这里看到的关于类似主题的建议,压缩所有下载不是一种选择.
失败的文件下载到其完整大小,并以正确的名称写入磁盘.尝试打开它们会导致错误消息,这种消息因类型而异.将下载的文件与hexdump中的原始文件进行比较,我可以看到该脚本在每个下载文件的开头插入以下字符: ef bb bf 然后下载的文件将再现原始文件,直到它停止在指定的大小 – 因此原始的最后6个字符总是丢失. 不幸的是,我对二进制文件的构成方式,这些字符可能意味着什么,或脚本插入它们的方式/原因一无所知. 这是脚本原样: $file = '94.ppt'; $path = $_SERVER['DOCUMENT_ROOT']."/relative/path/"; $full_path = $path.$file; if ($fd = fopen ($full_path,"r")) { $fsize = filesize($full_path); $path_parts = pathinfo($full_path); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename="".$path_parts["basename"]."""); break; case "txt": header("Content-type: text/plain"); header("Content-Disposition: attachment; filename="".$path_parts["basename"]."""); break; case "jpg": header("Content-type: image/jpeg"); header("Content-Disposition: attachment; filename="".$path_parts["basename"]."""); break; case "ppt": header("Content-Type: application/vnd.ms-powerpoint"); header("Content-Disposition: attachment; filename="".$path_parts["basename"]."""); break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename="".$path_parts["basename"]."""); } header("Content-Transfer-Encoding: binary"); header("Content-length: $fsize"); header("Cache-control: private"); while(!feof($fd)) { $buffer = fread($fd,2048); echo $buffer; } } fclose ($fd); exit; 开发系统是Apache 2.2.14(Ubuntu)上的PHP 5.3.2-1. Apache 2.0.63(某种类型的Linux)上的生产主机是PHP 5.2.9. 解决方法
EF BB BF是UTF-8编码
Byte Order Mark(BOM).我怀疑有一些配置选项可以关闭BOM.
编辑:文件编辑器应允许您在以相关字符编码(例如UTF-8)保存文件时关闭BOM. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |