·您当前的位置:首页 > 技术教程 > PHP教程 >

[PHP]用PHP程序判断上传文件类型的方法

时间:2014-07-20 20:23酷播
网上流传着一种说法,用PHP读文件头部两个字节判断文件真实类型,其实这样判断也是不精确的,就拿office的文件类型来说

     网上流传着一种说法,用PHP读文件头部两个字节判断文件真实类型,其实这样判断也是不精确的,就拿office的文件类型来说。

      word以前的格式是storage方式存储,但是现在最新版本的docx是一个zip包。

      即使是以前的storage方式存储的格式,也不能确定就是word文档,因为qq聊天记录也是采用这种方式存储的。所以,如果从文件格式分析的话,将会是很复杂的事情,但是可以实现精确的判断是不是word文档

      比如,读取storage结构,判断里面的子节点名字,如果是docx格式,先用zlib解压,再判断里面的xml文件和目录名字,等等,其他office格式类似。

      从上面一个简单的判断,我们可以得知,读文件头是不能真实判断文件类型的,判断文件类型,是一个很复杂的工作,下面是php读文件头判断文件类型的代码,但是不精准,可以作为参考。不过,除了office,其他还是挺准的。

  1. <?php    
  2. function file_type($filename) 
  3.     $file = fopen($filename, "rb"); 
  4.     $bin = fread($file, 2); //CuPlauyer.com提示:只读2字节 
  5.     fclose($file); 
  6.     $strInfo = @unpack("C2chars", $bin); 
  7.     $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
  8.     $fileType = ''
  9.     switch ($typeCode) 
  10.     { 
  11.         case 7790: 
  12.             $fileType = 'exe'
  13.             break; 
  14.         case 7784: 
  15.             $fileType = 'midi'
  16.             break; 
  17.         case 8297: 
  18.             $fileType = 'rar'
  19.             break;         
  20.         case 8075: 
  21.             $fileType = 'zip'
  22.             break; 
  23.         case 255216: 
  24.             $fileType = 'jpg'
  25.             break; 
  26.         case 7173: 
  27.             $fileType = 'gif'
  28.             break; 
  29.         case 6677: 
  30.             $fileType = 'bmp'
  31.             break; 
  32.         case 13780: 
  33.             $fileType = 'png'
  34.             break; 
  35.         default: 
  36.             $fileType = 'unknown: '.$typeCode; 
  37.     } 
  38.  
  39.     //CuPlauyer.com提示:Fix 
  40.     if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg'; 
  41.     if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png'; 
  42.  
  43.     return $fileType; 
  44.  
  45. echo file_type('start.php');   // 6063 or 6033 

但是我不知道反过来定义 6063或者6033 就是指php的话 是不是不够严谨啊。

对于上传文件类型的判断,一直没有太好的办法,即使使用上面的代码,也有办法构造假的图片 的(如何构造不再传播),有人使用getimagesize来判断,不失为一种好办法:

  1. if(in_array($attach['ext'], array('jpg', 'jpeg', 'gif', 'png', 'swf', 'bmp')) && function_exists('getimagesize') && !@getimagesize($target))  
  2.     unlink($target); 
  3.     upload_error('post_attachment_ext_notallowed', $attacharray); 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器