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中for循环语句的几种变型
Nov 26 PHP
PHP异步调用socket实现代码
Jan 12 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 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 radio 单选框获取与保持值的实现代码
2010/05/15 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
React Native 环境搭建的教程
2017/08/19 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
Python标准库之循环器(itertools)介绍
2014/11/25 Python
推荐11个实用Python库
2015/01/23 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
python实现飞机大战游戏
2020/10/26 Python
python检测服务器端口代码实例
2019/08/31 Python
python 求定积分和不定积分示例
2019/11/20 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
全球工业:Global Industrial
2020/02/01 全球购物
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android