int fpassthru ( resource $handle )将给定的文件指针从当前的位置读取到 EOF 并把结果写到输出缓冲区。 如果发生错误, fpassthru() 返回 FALSE。否则 fpassthru() 返回从 handle 读取并传递到输出的字符数目。 文件指针必须有效,并且必须指向一个由 fopen() 或 fsockopen() 成功打开(但还没有被 fclose() 关闭)的文件。如果已经向文件写入数据,就必须调用 rewind() 来将文件指针指向文件头。 如果既不修改文件也不在特定位置检索,只想将文件的内容下载到输出缓冲区,应该使用 readfile(),这样可以省去 fopen() 调用。 
-----------------------------可以用string file_get_contents(string $filename);代替

解决方案 »

  1.   

    仔细检查了一下,发现似乎问题并不出现在fpassthru 
    之前的 header 输出,直接就有了下载文件了,哪怕把 fpassthru 注释了 ,问题依旧
      

  2.   

    还以为是读文件的问题header("Cache-control: private"); // fix for IE 
    header("Content-Type: application/octet-stream"); 
    //下行可以省去
    header("Content-Length: ".filesize($uploadname)); header("Content-Disposition: attachment; filename=$uploadname"); print file_get_contents($uploadname);
      

  3.   

    呵呵 ,按照这样改了 还是不行因为没有到print file_get_contents($uploadname);
    这句 就开始执行了,文件已经可以下载了
    保存下来的文件 打开 还是乱码
      

  4.   

    同样的写法,我写过好几次的,从来都没有出错
    这次是在Zend FrameWork 的function里执行
    是不是这个原因啊
      

  5.   

    没有人知道这个问题吗?测试的时候,txt的文件就没有问题,doc文件提示文件编码不对,其他文件 例如图片 都打不开
      

  6.   

    我早上刚改了一下,没问题。
    <?
        $n = '../cms.rar';
        header("Cache-control: private"); // fix for IE  
        header("Content-Type: application/octet-stream");      header("Content-Length: ".filesize($n));      header("Content-Disposition: attachment; filename=".basename($n));      print file_get_contents($n);
    ?>
    文件是utf8编码,无签名。
      

  7.   

    问题找到了,是 bom捣鬼
    呵呵 谢谢楼上的兄弟