0

我正在尝试使用 php 下载一些文件以隐藏文件路径,但某些文件类型总是被破坏。pdf 和 mp3 等文件类型效果很好。doc、ppt、jpg 等文件类型总是下载损坏。

我使用这些 mimetypes

if (file_exists($file_real)){ 
$extension = strtolower(substr(strrchr($file, "."), 1)); 
switch($extension){ 
case "ppt": $type = "application/vnd.ms-powerpoint"; break; 
case "pdf": $type = "application/pdf"; break; //------ok
case "doc": $type = "application/msword"; break; 
case "mp3": $type = "audio/mpeg"; break;//------ok
case "jpg": $type = "image/jpg"; break;  
default: $type = "application/force-download"; break; 
} 

和这些标题

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public", false); 
header("Content-Description: File Transfer"); 
header("Content-Type: " . $type); 
header("Accept-Ranges: bytes"); 
header("Content-Disposition: attachment; filename=\"" . $header_file . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($file_real));
if ($stream = fopen($file_real, 'rb')){
            while(!feof($stream) && connection_status() == 0){
                set_time_limit(0);
                print(fread($stream,1024*8));
                flush();
            }
            fclose($stream);
        }
4

1 回答 1

1

我的猜测是您在 PHP 代码中输出空白字符。可能是换行符。这是通过 PHP 提供二进制文件时文件损坏的一个非常常见的原因,并且很难发现。在某些文件类型已损坏而其他文件类型未损坏的情况下,这也是非常典型的情况,因为某些文件类型可以处理额外的空白。

空格很容易进入 PHP 程序,只需在源代码中的<?phpand?>标记之外添加换行符即可。

检查您的 PHP 程序 - 以及所有包含的内容 - 以确保它们在程序结束后没有任何尾随空行?>。还要检查标记之前的文件顶部<?php,但程序末尾的空行更为常见。

事实上,最好?>完全删除结束标记 - 无论如何它是可选的,删除它意味着您绝对不会在 PHP 文件的末尾出现任何空白问题。

希望有帮助。

于 2012-06-02T21:04:54.183 回答