前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >php通过文件头检测文件类型通用类(zip,rar…)

php通过文件头检测文件类型通用类(zip,rar…)

原创
作者头像
IT工作者
发布于 2023-07-21 09:23:37
发布于 2023-07-21 09:23:37
3300
举报
文章被收录于专栏:程序技术知识程序技术知识

首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可。 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找。如:

代码语言:php
AI代码解释
复制
<?php 
 
/*通过文件名,获得文件类型*
 *@author chengmo QQ:8292669*
 *@copyright <a href="http://www.cnblogs.com/chengmo">http://www.cnblogs.com/chengmo</a> 2010-10-17
 *@version 0.1
 *$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png
 */
class cFileTypeCheck
{
    private static $_TypeList=array();
    private static $CheckClass=null;
    private function __construct($filename)
    {
        self::$_TypeList=$this->getTypeList();
    }
 
    /**
     *处理文件类型映射关系表*
     *
     * @param string $filename 文件类型
     * @return string 文件类型,没有找到返回:other
     */
    private function _getFileType($filename)
    {
        $filetype="other";
        if(!file_exists($filename)) throw new Exception("no found file!");
        $file = @fopen($filename,"rb");
        if(!$file) throw new Exception("file refuse!");
        $bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。
        fclose($file);
         
        $typelist=self::$_TypeList;
        foreach ($typelist as $v)
        {
            $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数
            $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度
             
            if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin)))) 
            {
                return $v[1];
            }
        }
        return $filetype;
    }
     
    /**
     *得到文件头与文件类型映射表*
     *
     * @return array array(array('key',value)...)
     */
    public function getTypeList()
    {
        return array(array("FFD8FFE1","jpg"),
        array("89504E47","png"),
        array("47494638","gif"),
        array("49492A00","tif"),
        array("424D","bmp"),
        array("41433130","dwg"),
        array("38425053","psd"),
        array("7B5C727466","rtf"),
        array("3C3F786D6C","xml"),
        array("68746D6C3E","html"),
        array("44656C69766572792D646174","eml"),
        array("CFAD12FEC5FD746F","dbx"),
        array("2142444E","pst"),
        array("D0CF11E0","xls/doc"),
        array("5374616E64617264204A","mdb"),
        array("FF575043","wpd"),
        array("252150532D41646F6265","eps/ps"),
        array("255044462D312E","pdf"),
        array("E3828596","pwl"),
        array("504B0304","zip"),
        array("52617221","rar"),
        array("57415645","wav"),
        array("41564920","avi"),
        array("2E7261FD","ram"),
        array("2E524D46","rm"),
        array("000001BA","mpg"),
        array("000001B3","mpg"),
        array("6D6F6F76","mov"),
        array("3026B2758E66CF11","asf"),
        array("4D546864","mid"));
    }
 
    public static function   getFileType($filename)
    {
        if(!self::$CheckClass) self::$CheckClass=new self($filename);
        $class=self::$CheckClass;
        return $class->_getFileType($filename);
    }
}

怎么样获得头字节码:

可以看到:png 文件,头是4个字节(头标记是多少字节需要自己查相关资料确定),对应是:89504E47

如果你对php的pack unpack 不很熟悉,可以查看相关文档。

调用实例:

$filename="d:/1.png"; echo $filename,"\t",cFileTypeCheck::getFileType($filename),"\r\n"; $filename="d:/test.doc"; echo $filename,"\t",cFileTypeCheck::getFileType($filename),"\r\n";

d:/1.png    png d:/test.doc    xls/doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
【JVM进阶之路】十:JVM调优总结
JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹。
三分恶
2021/04/13
15.5K0
单核CPU, 1G内存,也能做JVM调优吗?
最近,笔者的技术群里有人问了一个有趣的技术话题:单核CPU, 1G内存的超低配机器,怎么做JVM调优?
用户7927337
2020/11/04
2K0
单核CPU, 1G内存,也能做JVM调优吗?
笔者带你剖析大规模分布式Java平台JVM性能调优基础
其实说到对JVM进行性能调优早已是一个老生常谈的话题,如果你所在的技术团队还暂时达不到淘宝团队那样的高度,无法满足在OpenJDK的基础之上根据自身业务进行针对性的二次开发和定制调优,那么对于你来说,唯一的选择就是尽可能的熟悉JVM的内存布局,以及熟练掌握与GC相关的那些选项配置,否则JVM的基础性能调优不是痴人说梦?
九州暮云
2019/08/21
4160
笔者带你剖析大规模分布式Java平台JVM性能调优基础
提升Java性能:深入理解JVM调优技巧
大家好,我是默语,擅长全栈开发、运维和人工智能技术。在本篇博客中,我将带大家深入理解Java虚拟机(JVM)的调优技巧,帮助您提升Java程序的性能。本篇文章将涵盖JVM的基本概念、内存管理、垃圾回收、性能监控和常见的调优策略。希望通过这些分享,能帮助大家更好地了解和使用JVM进行性能优化。关键词:JVM调优、Java性能优化、垃圾回收、内存管理、性能监控。
默 语
2024/11/22
1350
手把手教你定位常见Java性能问题
性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就没办法出现性能问题,包括笔者自己遇到的性能问题也不多,所以为了提前储备知识,当出现问题的时候不会手忙脚乱,我们本篇文章来模拟下常见的几个Java性能故障,来学习怎么去分析和定位。
Guide哥
2020/05/07
1.2K0
手把手教你定位常见Java性能问题
深入浅出JVM调优,看完你就懂
JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。
全栈程序员站长
2022/09/05
5640
深入浅出JVM调优,看完你就懂
90%的人会遇到性能问题,如何用1行代码快速定位?
今天,齐光将会基于之前列举的众多指标,给出一些常见的调优分析思路,即:如何在众多异常性能指标中,找出最核心的那一个,进而定位性能瓶颈点,最后进行性能调优。整篇文章会按照代码、CPU、内存、网络、磁盘等方向进行组织,针对对某一各优化点,会有系统的「套路」总结,便于思路的迁移实践。
Datawhale
2019/12/09
8760
90%的人会遇到性能问题,如何用1行代码快速定位?
JVM调优工具详解
学习了JVM的一些调优工具为大家分享一下,现在把学习笔记总结记录一下,如果记录有些错误,还望指出。
全栈程序员站长
2022/09/04
4440
JVM调优工具详解
JVM性能调优详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序新视界
2019/11/12
1K0
jvm入门3:6-8 本地方法接口+本地方法栈+堆
1一个Native Method是一个java调用非java代码的接口。一个Native Method由java语言实现, 这个特征非java所特有,其他的编程语言都有这个机制,C++的extern告知c++编译器调用c的函数;2在定义一个native method时,并不提供实现体,实体体由java语言在外面实现的;3本地接口的作用是融合不同的编程语言为java所用,初衷为融合c/c++程序
用户10832809
2025/02/24
580
Java调优经验谈
调优是需要做好准备工作的,毕竟每一个应用的业务目标都不尽相同,性能瓶颈也不会总在同一个点上。在业务应用层面,我们需要:
lyb-geek
2018/12/24
8220
Java调优经验谈
JVM之堆
约定:新生区 <–> 新生代 <–> 年轻代 、 养老区 <–> 老年区 <–> 老年代、 永久区 <–> 永久代
冬天vs不冷
2025/01/20
1150
JVM之堆
JVM性能调优总结:JVM内存模型,内存泄漏及解决方法,调优方法~
其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。
秃顶的Java程序员
2020/03/22
2.1K0
JVM性能调优总结:JVM内存模型,内存泄漏及解决方法,调优方法~
性能调优思路
性能瓶颈的表象:资源消耗过多、外部处理系统的性能不足、资源消耗不多但程序的响应速度却仍达不到要求。
lyb-geek
2019/08/19
9580
JVM02——JVM垃圾回收与性能调优
当一个对象被引用一次则计数+1,失去引用计数-1,当计数为0则判断为垃圾。但当对象间存在循环引用时(如下图)会无法被回收。
半旧518
2022/10/26
4030
JVM02——JVM垃圾回收与性能调优
《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建。一些类信息,常量,静态变量等存储在方法区。堆和方法区都是线程共享的。 GC机制是由JVM提供,用来清理需要清除的对象,回收堆内存。 GC机制将Java程序员从内存管理中解放了出来,可以更关注于业务逻辑。 在Java中,GC是由一个被称为垃圾回收器的守护线程执行的。 在从内存回收一个对象之前会调用对象的finalize()方法。 作为一个Java开发者不能强制JVM执行GC;GC的触发由JVM依据堆内存的大小来决定。 Syste
程序员鹏磊
2018/02/09
1.5K0
《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
技能篇:linux服务性能问题排查及jvm调优思路
只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求。最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的。如果你是负责中间件或IM通讯相关项目开发,或许就需要偏向CPU、磁盘、网络及内存方面的问题排查及调优技能
潜行前行
2022/04/26
8480
技能篇:linux服务性能问题排查及jvm调优思路
Java 14 Hotspot 虚拟机垃圾回收调优指南!
出处:www.cnblogs.com/sxpujs/p/12638114.html
Java技术栈
2020/06/16
6070
Java  14 Hotspot 虚拟机垃圾回收调优指南!
JVM性能调优篇
GC 优化的基本原则是:将不同的 GC 参数应用到两个及以上的服务器上然后比较它们的性能,然后将那些被证明可以提高性能或减少 GC 执行时间的参数应用于最终的工作服务器上。
李红
2019/05/29
9830
JVM调优经验分享
本次分享探讨的JVM调优是指server端运行的JVM调优,适应版本为[1.6– 1.7], 不涉及最新的1.8版本。
全栈程序员站长
2022/09/03
2.5K0
JVM调优经验分享
相关推荐
【JVM进阶之路】十:JVM调优总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档