PHP取二进制文件头快速判断文件类型的实现代码


Posted in PHP onAugust 05, 2013

一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别,PHP扩展中提供了类似 exif_imagetype 这样的函数读取图片类的文件类型,但是很多时候扩展不一定安装了,有时候就需要自己来实现识别文件类型的工作。

下面代码就展示了自己通过读取文件头信息来识别文件的真实类型。

<?php
     $files = array(
        'c:\1.jpg',
        'c:\1.png',
        'c:\1.gif',
        'c:\1.rar',
        'c:\1.zip',
        'c:\1.exe',
    );
    foreach ($files AS $file) {
        $fp = fopen($file, "rb");
        $bin = fread($fp, 2); //只读2字节
        fclose($fp);
        $str_info  = @unpack("C2chars", $bin);
        $type_code = intval($str_info['chars1'].$str_info['chars2']);
        $file_type = '';
        switch ($type_code) {
            case 7790:
                $file_type = 'exe';
                break;
            case 7784:
                $file_type = 'midi';
                break;
            case 8075:
                $file_type = 'zip';
                break;
            case 8297:
                $file_type = 'rar';
                break;
            case 255216:
                $file_type = 'jpg';
                break;
            case 7173:
                $file_type = 'gif';
                break;
            case 6677:
                $file_type = 'bmp';
                break;
            case 13780:
                $file_type = 'png';
                break;
            default:
                $file_type = 'unknown';
                break;
        }        echo $file , ' type: <b>', $file_type, '</b> code:<b>', $type_code, '</b><br />';
    }

本例输出结果
c:\1.jpg type: jpg code:255216
c:\1.png type: png code:13780
c:\1.gif type: gif code:7173
c:\1.rar type: rar code:8297
c:\1.zip type: zip code:8075
c:\1.exe type: exe code:7790
PHP 相关文章推荐
PHP中GET变量的使用
Oct 09 PHP
一个好用的分页函数
Nov 16 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 PHP
php实现的一段简单概率相关代码
May 30 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
详解Laravel框架的依赖注入功能
May 27 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 #PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 #PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 #PHP
php多层数组与对象的转换实例代码
Aug 05 #PHP
注意:php5.4删除了session_unregister函数
Aug 05 #PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 #PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 #PHP
You might like
php header Content-Type类型小结
2011/07/03 PHP
PHP代码优化技巧小结
2015/09/29 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
js实现网页收藏功能
2015/12/17 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
python生成器generator用法实例分析
2015/06/04 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
python 基础教程之Map使用方法
2017/01/17 Python
Python Logging 日志记录入门学习
2018/06/02 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
服装店营销方案
2014/03/10 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
骨干教师考核评语
2014/12/31 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript