加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何修复这个破坏文件的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读