加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php获得上传文件类型的几种技巧

发布时间:2022-07-18 14:24:57 所属栏目:PHP教程 来源:互联网
导读:1、mime_content_type()函数判断获取文件类型 mime_content_type返回指定文件的MIME类型, 用法: 1 echomime_content_type(php.gif) .n; echomime_content_type(test.php); 输出: image/gif 2、php Fileinfo 获取文件类型(finfo_open) PHP官方推荐mime_con
  1、mime_content_type()函数判断获取文件类型
 
  mime_content_type返回指定文件的MIME类型,
 
  用法:
 
  1 echomime_content_type('php.gif') ."n";
 
  echomime_content_type('test.php');
 
  输出:
 
  image/gif
 
 
  2、php Fileinfo 获取文件类型(finfo_open)
 
  PHP官方推荐mime_content_type()的替代函数是Fileinfo函数。PHP 5.3.0+已经默认支持Fileinfo函数(fileinfo support-enabled),不必进行任何配置即可使用finfo_open()判断获取文件MIME类型。
 
  用法代码如下:
 
  $finfo   = finfo_open(FILEINFO_MIME);
   
  $mimetype = finfo_file($finfo, $filename);
   
  finfo_close($finfo);
  3、image_type_to_mime_type()获取图片类型
 
  如果需要判断MIME类型的文件只有图像文件,那么首先可以使用exif_imagetype()函数获取图像类型常量,再用image_type_to_mime_type()函数将图像类型常量转换成图片文件的MIME类型。
 
  注意:
 
  需要在php.ini中配置打开php_mbstring.dll (Windows需要)和extension=php_exif.dll。
 
  4、php获取上传文件类型
 
  如果使用php上传文件,检测上传文件的MIME类型,则可以使用全局变量$_FILES['uploadfile']['type'],由客户端的浏览器检测获取文件MIME类型。
 
  下面直接上代码,相信略有些php功底的朋友,读来都不成问题,我实现的是仅支持word和pdf文件,且文件大小小于512kb:
 
  $tmpname = $_FILES ['userfile'] ['tmp_name'];
   
   if(is_uploaded_file($tmpname)) {
   
    $mimetype = detectMIME($tmpname);
   
    $tuozhanming = getFileExt($filename, $mimetype);
   
    if($tuozhanming == "type_error"){
   
     echo '仅支持word和pdf文件,且文件大小小于512kb:<a href='.$reurl.'>请重试</a>';
   
     exit();
   
    }
   
   }else{
   
    $_FILES ['userfile'] ['error'] = 6;
   
   }
      if ($_FILES ['userfile'] ['error'] > 0) {
   
    echo 'Problem: ';
   
    switch ($_FILES ['userfile'] ['error']) {
   
     case 1 :
   
      echo '上传文件过大:<a href='.$reurl.'>请重试</a>';
   
      break;
   
     case 2 :
   
      echo '上传文件过大:<a href='.$reurl.'>请重试</a>';
   
      break;
   
     case 3 :
   
      echo '文件上传丢失:<a href='.$reurl.'>请重试</a>';
   
      break;
   
     case 4 :
   
      echo '无文件被上传:<a href='.$reurl.'>请重试</a>';
   
      break;
   
     case 6 :
   
      echo '仅支持word和pdf文件,且文件大小小于512kb:<a href='.$reurl.'>请重试</a>';
   
      break;
   
     case 7 :
   
      echo '上传文件存储失败:<a href='.$reurl.'>请重试</a>';
   
      break;
    //上传文件  
   
   $_FILES ['userfile'] ['name'] = time () . "." . $tuozhanming;
   
   $upfile = '../uploads/' . $_FILES ['userfile'] ['name'];
      if ( !move_uploaded_file ( $_FILES ['userfile'] ['tmp_name'], $upfile )) {
   
    echo 'Problem: 文件移动失败';
   
    exit ();
   
   }  
   
  }
   function detectMIME($filename) {
   
   $file = fopen ( $filename, "rb" );
   
   $finfo = finfo_open ( FILEINFO_MIME );
   
   if (! $finfo) {
   
    // 直接读取文件的前4个字节,根据硬编码判断
   
    $file = fopen ( $filename, "rb" );
   
    $bin = fread ( $file, 4 ); //只读文件头4字节
   
    fclose ( $file );
   
    $strInfo = @unpack ( "C4chars", $bin );
   
    //dechex() 函数把十进制转换为十六进制。
   
    $typeCode = dechex ( $strInfo ['chars1'] ) .  
   
               dechex ( $strInfo ['chars2'] ) .  
   
               dechex ( $strInfo ['chars3'] ) .  
   
               dechex ( $strInfo ['chars4'] );
   
    $type = '';
   
    switch ($typeCode) //硬编码值查表
   
    {
   
     case "504b34" :
   
      $type = 'application/zip; charset=binary';
   
      break;
   
     case "d0cf11e0" :
   
      $type = 'application/vnd.ms-office; charset=binary';
   
      break;
   
     case "25504446" :
    
   } else {
   
    //finfo_file return information of a file
   
    $type = finfo_file ( $finfo, $filename );
   
   }
   
   return $type;
     function getFileExt($filename, $type) {
   
   switch ($type) {
   
    case "application/zip; charset=binary" :
   
     $extType = "docx";
   
     break;
   
    case "application/vnd.ms-office; charset=binary" :
   
     $extType = "doc";
   
     break;
   
    case "application/msword; charset=binary" :
   
         $extType = "doc";
   
        break;
   
    case "application/pdf; charset=binary" :
   
     $extType = "pdf";
    
   return $extType;
   
  }
  方法五,网上流传一段PHP读取文件头判断文件类型的方法,有一些bug,经我(54chen)修改实测,应该是这个样子:
 
  /**
   
  * 读取文件前几个字节 判断文件类型
   
  *
   
  * @return String
   
  */
   
  function checkTitle($filename) {
   
  $file     = fopen($filename, "rb");
   
  $bin      = fread($file, 2); //只读2字节
   
  fclose($file);
   
  $strInfo  = @unpack("c2chars", $bin);
   
  $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
   
  $fileType = '';
   
  switch ($typeCode)
   
  { 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读