ob_start("ob_gzhandler")与ob_*配合使用时导致浏览无法识别内容/开启gzip时且测试通过的下载代码

<?php
error_reporting(E_ALL);
ob_start("ob_gzhandler");//只要使用了它,后面的某些ob操作将导致问题
echo "content";
ob_end_clean();
ob_start();
ob_clean();
echo "more content";


firefox 12运行这上面的代码直接显示:

您尝试查看的页面无法显示,因为它使用了无效的或者不支持的压缩格式。


opera却能正常显示.


使用linux wget却也是正常的


root:/var/log/apache2# wget http://cms.china.net/temp_test.php                                            
--2012-05-22 23:44:42--  http://cms.china.net/temp_test.php                                                       
Resolving cms.chinahrd.net... 219.232.28.8                                                                         
Connecting to cms.chinahrd.net|219.232.28.58|:80... connected.                                                      
HTTP request sent, awaiting response... 200 OK                                                                       
Length: 12 [text/html]                                                                                               
Saving to: `temp_test.php'                                                                                           
                                                                                                                     
100%[===========================================================================>] 12          --.-K/s   in 0s       
                                                                                                                     
2012-05-22 23:44:43 (2.40 MB/s) - `temp_test.php' saved [12/12]                                                      
                                                                                                                     
root:/var/log/apache2# cat temp_test.php                                                                     
more contentroot:/var/log/apache2#                                                                           
                                                                                                                     
                                                
所以这应该是浏览解析的问题.肯定也是gzip处理后的问题导致.

最好的方法是不使用gzip,或是使用了就不要使用ob其它操作.


用话,有人建议这样用


ob_start("ob_gzhandler");echo("trashed");ob_end_clean();ob_start("ob_gzhandler");echo("output");ob_end_flush();


-------------------------开启gzip功能且能正常下载的代码,一般需要测试的文件是rar之类严格内容格式的文件类型,测试时可以使用------



function phpDown($file, $name = null){
    $file = str_replace(array('../', './'), '', $file);//不允许导致安全问题的路径出现,需要过滤./../
    
    if( file_exists($file) ){
        $path_parts = pathinfo($file);
        $size = filesize($file);
        if ($size < 1) exit('空白文件,不需要下载');
        $fileName = 'filename'.(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox')>0 ? "*=\"utf8''" : '="') 
                    .rawurlencode($name ? $name.'.'.strtolower($path_parts["extension"]) : basename($file)).'"';//解决firfox与其它浏览处理中文名问题
        if(ob_get_length() !== false) @ob_end_clean();//尝试清除影响内容的前面输出
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');//任何文件类型都保存,非浏览
        header('Content-Disposition: attachment; ' .$fileName);
        header('Content-Encoding: none');//如果使用gzip将会导致问题,必须强制下载不使用压缩
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . $size);//给出大小
        readfile($file);
        exit;
    } else  die('File Not Found');


-----------------查看下载页面返回的全部内容:header与body,利用它可以看到浏览器怎么处理-------


<?php
header('Content-Type: text/html; charset=UTF-8');
var_dump(htm('/index.php?m=chrd&c=tooldown&a=down&aid=16170'));
/*
 * 从其它服务器请求htm,目的是方便修改,只需要修改一个htm多个页面变化
 */
function htm($file) {
    $incHost = 'cms.china.net';
    $htm = fsockopen($incHost, 80, $errno, $errstr, 30);
        
    if (!$htm) {
        return "$errno, $errstr";
    } else {
        $crlf = "\r\n";
        $get = "GET {$file} HTTP/1.1{$crlf}"
            ."Host: {$incHost}{$crlf}"
            ."Connection: Close{$crlf}"
            .$crlf;//表示提交结束了
        fwrite($htm, $get);
        $get = '';
        
        while (!feof($htm)) {
            $get .= fgets($htm, 128);
        }
        
        fclose($htm);
        
        return $get;
    }
}


-------

对于这个问题,网上很多人都只是说是php bug,经过测试应该不是,尝试了一天,误以为报头中编码这块只能设置编码,不能禁用.因为从浏览器中总是看到gzip,而使用上面的php查看返回头却是没有gzip报头的.导致rar格式有误的就是因为gzip报头影响只要处理掉它就基本上没事,这步是关键,对于清空缓存,这步,只是前面有输出时才是有必要的.那只是加了个保险


上面的问题在我测试时只出现在下面这个环境下

Apache Version     Apache/2.2.20 (Win32) PHP/5.3.3 


而我在这个环境测试没有任何上面提到的问题.

PHP Version 5.4.0

Windows NT QIDIZI 6.1 build 7601 (Windows 7 Home Basic Edition Service Pack 1) i586

Apache/2.2.17 (Win32) PHP/5.4.0

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随与我联系,我会及为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随与我联系,我会及解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值