可以使用pathinfo方法来通过后缀名进行判断文件类型。

/** 

    * 获取文件后缀(如果文件名为11.11,11不是后缀,会默认11为后缀)

    * $file string 文件路径或者文件名

    */

    function get_extension($file){

        return pathinfo($file, PATHINFO_EXTENSION);

    }

说明: pathinfo具体使用方法,可以查看php手册。但是该方法仅仅只能根据文件后缀来判断文件类型,如果html后缀的文件,被修改成.php的后缀之后,读取到的则是php类型文件。

$_FILES

如果是php上传文件,则可以用$_FILES[‘uploadfile’][‘type’]来获取文件类型,但是同样会存在和pathinfo同样的问题,该方法仅仅只能根据文件后缀来判断文件类型。

php Fileinfo 获取文件MIME类型(finfo_open)

<?php

    $finfo = finfo_open(FILEINFO_MIME); // 返回 mime 类型

    $filename = '.\Uploads\2.zip';

    var_dump(finfo_file($finfo, $filename));

    finfo_close($finfo);

    die;

说明: 如果文件存在则返回文件类型,否则返回false。该方法需要php5.3.0+版本。可以根据返回的结果来判断是什么类型的文件。该方法即便是原文件被改过后缀,已然可以读到原文件类型。

读取文件头六个字节作为判断。

<?php

// 官方示例

function minimime($fname) {

    $fh=fopen($fname,'rb');

    if ($fh) { 

        $bytes6=fread($fh,6);

        fclose($fh); 

        if ($bytes6===false) return false;

        if (substr($bytes6,0,3)=="\xff\xd8\xff") return 'image/jpeg';

        if ($bytes6=="\x89PNG\x0d\x0a") return 'image/png';

        if ($bytes6=="GIF87a" || $bytes6=="GIF89a") return 'image/gif';

        return 'application/octet-stream';

    }

    return false;

}

// 将文件头4个字节转换成16进制判断

function fileType($filename) {

    // 读取文件的前4个字节,根据硬编码判断

    $file = fopen ( $filename, "rb" );

    $strFile = fread ( $file, 4 ); //只读文件头4字节

    fclose ( $file );

    $strInfo = @unpack ( "C4chars", $strFile );  

    //dechex(),把十进制转换为十六进制。  

    $code = dechex ( $strInfo ['chars1'] ) .   

            dechex ( $strInfo ['chars2'] ) .   

            dechex ( $strInfo ['chars3'] ) .   

            dechex ( $strInfo ['chars4'] );  

    $type = '';  

    switch ($code) //硬编码值查表  

    {

        case "504b34" :  

            $type = 'application/zip; charset=binary';  

            break;

        case "89504e47" :

            $type = 'image/png; charset=binary';  

            break; 

        default :

            $type = false;  

            break;

    }

    return $type;

}

这个方法有缺陷,不同类型的文件,文件头4个字节可能会相同,并且部分文件类型表示文件类型的字符串,少于4个字节。可以考虑将方法三和方法四结合使用。

最新文章

  1. Ubuntu服务器被黑经历(ElastichSearch漏洞)
  2. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
  3. try,catch,finally含return时的执行顺序及丢失的伪例
  4. Tigase XMPP Server的安装
  5. 关于netstat
  6. RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考
  7. [Asp.Net]状态管理(Session、Application、Cache)
  8. 常用的CSS Hack技术集锦
  9. hotplug\uevent机制(1)
  10. Spring Mvc session拦截器实现
  11. Mylyn
  12. jQuery 源码学习(先放在这,未开始)
  13. spring mvc中,直接注入的HttpServletRequst是否安全呢?
  14. 面试时怎样回答:你对原生ajax的理解
  15. python异步编程模块asyncio学习(二)
  16. mysql where in形式存储过程如何传递带有单引号的入参
  17. Pandas DataFrame笔记
  18. CF760 D Travel Card 简单DP
  19. Nodejs Express笔记
  20. 【HackerRank】Cut the tree

热门文章

  1. Spring4学习回顾之路11-AOP
  2. idea 如何加入插件SonarLint
  3. Django-报错信息及admin后台汉化
  4. dos(cmd)命令大全(本文摘至于网络)
  5. Python中的math常用方法总结(转)http://www.cnblogs.com/renpingsheng/p/7171950.html
  6. CodeFirst实体类中,为什么都把ICollection&lt;x&gt;定义成virtual?
  7. winForm入门学习
  8. 三调数据库标注插件v1.3
  9. Python算法题(三)——经典函数题
  10. HTTP请求方式及其区别