宜昌本地软件开发与弱电工程服务商
项目咨询 · 快速响应
您当前的位置: > 博客2 > PHP教程

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

2016-10-13 00:16:48 点击量:48 标签: 收藏本文

     网上流传着一种说法,用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); 

 

ABOUT US
宜昌农人网络科技有限公司

我们是一家提供综合软件外包与弱电工程服务的技术公司。

业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。

公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室