我有一个force download脚本,它可以用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。生产主机是Apache2.0.63(某种Linux类型)上的PHP5.2.9。

最佳答案

EF BB BF是utf-8编码Byte Order Mark(bom)。我怀疑有一些配置选项可以关闭bom。
编辑:文件编辑器应允许您在相关字符编码(如utf-8)中保存文件时关闭bom。

10-05 20:46
查看更多