我的Code如下:
<?php
 
  $filepath="c:\123.jpg";
  $filesize=filesize($filepath);
  $fs=fopen($filepath,"r");
  $readlen=1024;//每次读取多少字节
  $rlen=0;//共读取多少字节
  while(!feof($fs)){
     $data=fread($fs,$readlen);
     $rlen+=$readlen;
   }
   fclose($fs);
   echo '文件大小'.$filesize.'<br/>';
   echo '读取大小'.$rlen.'<br/>';
?>
PHP朋友们给看看,我电脑系统windows 7的,这应该与系统无关系.

解决方案 »

  1.   

    这恰恰与系统有关!
    window 的文件打开方式有文本方式和二进制方式的区别
    文本方式下,会对每个 \n (不是 \r\n 组合)附加一个 \r,形成 \r\n
    所以字节数就多出来了你需要用二进制防止打开图片
    $fs=fopen($filepath,"rb");或者直接用 file_get_contents
      

  2.   

    还是没读仔细,手册这样写:
    ---------------------------------------------------------Note: 不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n作为行结束字符,基于 Windows 的系统使用 \r\n作为行结束字符,基于 Macintosh 的系统使用 \r作为行结束字符。 如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。 Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。与此对应还可以使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。 默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 \n 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 't'。在所有其它情况下使用 'b'。 在操作二进制文件时如果没有指定 'b'标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。 Note: 为移植性考虑,强烈建议在用 fopen()打开文件时总是使用 'b' 标记。 Note: 再一次,为移植性考虑,强烈建议你重写那些依赖于 't' 模式的代码使其使用正确的行结束符并改成 'b' 模式。
    ---------------------------------------------------------------------------------------------1.不管什么语言,非文本文件习惯一下用rb好
    2.php的话,win系统就一律习惯b,尤其是unicode文本不使用b参数很容易出错
      

  3.   

    还是有问题,
    $fs=fopen($filepath,"rb"); 
    比实际文件字节多读出了十几个字节
    是while循环读取有问题?
    有在自己机器上成功得出正确结果的朋友吗?
      

  4.   

    $rlen+=$readlen;
    改为
    $rlen += strlen($data);通常最后一次读取时,是读不到 $readlen 字节的。因为文件已结束
      

  5.   

    我本意是实现读取服务器一个图片文件,发送到客户端
    修改后的完整代码是,但仍旧有问题<?php
     
      function DownFile_shortpath($filename,$downname){
       $filepath=str_ireplace("/","\\",$_SERVER['DOCUMENT_ROOT'].$filename);
       $filepath=iconv("utf-8","gb2312",$filepath);
       $downname=iconv("utf-8","gb2312",$downname);
       if(!file_exists($filepath)){
        throw new Exception('文件不存在');
       }
       //$count=0;
       //添加http报文
       header("Content-type: application/octet-stream");
       header("Accept-Ranges: bytes");
       header("Accept-Length: $filesize");
       header("Content-Disposition: attachment; filename=".$downname);
       $filesize=filesize($filepath);
       $fs=fopen($filepath,"rb");
       $readlen=1024;
       while(!feof($fs)){
        $data=fread($fs,$readlen);
        echo $data;
       }
       fclose($fs);
      }
     DownFile_shortpath('\http\123.jpg','123.jpg');
    ?>
      

  6.   

    此代码在windows xp上成功运行 windows 7上仍旧有问题
    <?php
     $filepath="f:\\C.rar";
     $downname="测试.rar";
     $filepath=iconv("utf-8","gb2312",$filepath); 
     $downname=iconv("utf-8","gb2312",$downname); 
     $filesize=filesize($filepath); 
     header("Content-type: application/octet-stream");    
     header("Accept-Ranges: bytes");    
     header("Accept-Length: $filesize");    
     header("Content-Disposition: attachment; filename=".$downname); 
     $fs=fopen($filepath,"rb");   
     $readlen=1024;
     while(!feof($fs)){  
    $data=fread($fs,$readlen); 
    echo $data;
     }    
     fclose($fs); ?>
      

  7.   

    你还要考虑最后一块不足1024的情况while(!feof($fs) && $file_size - 已读完的字节 > $readlen)退出循环再输出剩余字节