大家好,现在我们的项目遇到了一个比较困扰的问题。使用readfile下载图片文件时,文件会文件首会比原来多出一位(0x0A)来,使用UEdit删除文件首的那个16进制位文件可正确读出。源代码如下:<?php
$file = 'test_img.bmp';if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>下载后的文件和原文件比较如下:
代码在以前的服务器上运行从未出现问题,但当我们的项目更换了运行支撑环境(操作系统/apache/php 版本均有可能不同),在网上查遍了所有的文档,无解决办法。求高手解决此问题,在此先感谢大家了!如有有效解决办法,将给您追加到200分结贴。

解决方案 »

  1.   


    //给你一段//$mime,文件类型
    //$filename,这个不用说了吧
    //$data 是你要输出的文件数据,你试试用 file_get_contents 来获得
    if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE)
    {
    header('Content-Type: "'.$mime.'"');
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header("Content-Transfer-Encoding: binary");
    header('Pragma: public');
    header("Content-Length: ".strlen($data));
    }
    else
    {
    header('Content-Type: "'.$mime.'"');
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header("Content-Transfer-Encoding: binary");
    header('Expires: 0');
    header('Pragma: no-cache');
    header("Content-Length: ".strlen($data));
    } exit($data);
      

  2.   

    刚用了你的代码测试了一下,没出现你说的问题。 ob_clean();
        flush();把这两句去掉看看。
      

  3.   

    是的,我们是换了部署环境后出现的问题,我写的那段代码是php官方文档readfile 的示例代码,以前的运行环境正常,但是新的环境出现了这个很诡异的问题。 ob_clean();
      flush();去掉也是不行的,这个上面您还有其他的思路吗。
      

  4.   

    我们以前的运行环境也是正常的,我的那段代码是readfile的php手册示例代码,依然无效。去掉了ob_clean();flush(); 也不可以。您还有其他的思路吗?基本上能试到的方法都试过了。
      

  5.   

    源代码如下:[code=PHP]<?php
    $file = 'test_img.bmp';很显然,您的 <?php 前有一个空行
    更低级的就是你连 BOM 头都没有避讳
      

  6.   

    感谢大家的答案,由于网络问题,前两天未能及时结贴,请谅解。最终的解决办法是通过多次ob_clean及flush操作清空了缓冲区中打印的换行符\n。由于我对积分规则不太了解,现在的帖子已经无法加到200分了,本贴子按100分结贴,不过还是要感谢大家的热心回复。祝福你们工作生活愉快。