java如何实现判断文件的真实类型

发布时间 - 2026-01-11 02:48:24    点击率:

在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。

比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。

Java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:

package com.zhuifeng.util.excel; 
 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.HashMap; 
 
/** 
 * @author guoxk 
 * 
 * 类描述:获取和判断文件头信息 
 *  |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 
 *  |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 
 *  |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。 
 * 
 */ 
public class CheckExcelFileTypeUtil { 
  // 缓存文件头信息-文件头信息 
  public static final HashMap<String, String> mFileTypes = new HashMap<String, String>(); 
  static { 
    // images 
    mFileTypes.put("FFD8FF", "jpg"); 
    mFileTypes.put("89504E47", "png"); 
    mFileTypes.put("47494638", "gif"); 
    mFileTypes.put("49492A00", "tif"); 
    mFileTypes.put("424D", "bmp"); 
    // 
    mFileTypes.put("41433130", "dwg"); // CAD 
    mFileTypes.put("38425053", "psd"); 
    mFileTypes.put("7B5C727466", "rtf"); // 日记本 
    mFileTypes.put("3C3F786D6C", "xml"); 
    mFileTypes.put("68746D6C3E", "html"); 
    mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件 
    mFileTypes.put("D0CF11E0", "doc"); 
    mFileTypes.put("D0CF11E0", "xls");//excel2003版本文件 
    mFileTypes.put("5374616E64617264204A", "mdb"); 
    mFileTypes.put("252150532D41646F6265", "ps"); 
    mFileTypes.put("255044462D312E", "pdf"); 
    mFileTypes.put("504B0304", "docx"); 
    mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件 
    mFileTypes.put("52617221", "rar"); 
    mFileTypes.put("57415645", "wav"); 
    mFileTypes.put("41564920", "avi"); 
    mFileTypes.put("2E524D46", "rm"); 
    mFileTypes.put("000001BA", "mpg"); 
    mFileTypes.put("000001B3", "mpg"); 
    mFileTypes.put("6D6F6F76", "mov"); 
    mFileTypes.put("3026B2758E66CF11", "asf"); 
    mFileTypes.put("4D546864", "mid"); 
    mFileTypes.put("1F8B08", "gz"); 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:根据文件路径获取文件头信息 
   * @param filePath 文件路径 
   * @return 文件头信息 
   */ 
  public static String getFileType(String filePath) { 
//   System.out.println(getFileHeader(filePath)); 
//   System.out.println(mFileTypes.get(getFileHeader(filePath))); 
    return mFileTypes.get(getFileHeader(filePath)); 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:根据文件路径获取文件头信息 
   * @param filePath 文件路径 
   * @return 文件头信息 
   */ 
  public static String getFileHeader(String filePath) { 
    FileInputStream is = null; 
    String value = null; 
    try { 
      is = new FileInputStream(filePath); 
      byte[] b = new byte[4]; 
      /* 
       * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length 
       * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len) 
       * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 
       */ 
      is.read(b, 0, b.length); 
      value = bytesToHexString(b); 
    } catch (Exception e) { 
    } finally { 
      if (null != is) { 
        try { 
          is.close(); 
        } catch (IOException e) { 
        } 
      } 
    } 
    return value; 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示 
   * @param src 要读取文件头信息的文件的byte数组 
   * @return  文件头信息 
   */ 
  private static String bytesToHexString(byte[] src) { 
    StringBuilder builder = new StringBuilder(); 
    if (src == null || src.length <= 0) { 
      return null; 
    } 
    String hv; 
    for (int i = 0; i < src.length; i++) { 
      // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写 
      hv = Integer.toHexString(src[i] & 0xFF).toUpperCase(); 
      if (hv.length() < 2) { 
        builder.append(0); 
      } 
      builder.append(hv); 
    } 
//   System.out.println(builder.toString()); 
    return builder.toString(); 
  } 
  /** 
   * @author guoxk 
   * 
   * 方法描述:测试 
   * @param args 
   * @throws Exception 
   */ 
  public static void main(String[] args) throws Exception { 
    final String fileType = getFileType("E:\\补贴名单.xls"); 
    System.out.println(fileType); 
  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 判断文件类型  # java判断文件的类型  # java如何判断文件类型  # Android中Java根据文件头获取文件类型的方法  # java文件对话框过滤特定文件类型示例  # javascrip客户端验证文件大小及文件类型并重置上传  # 的是  # 最多  # 上传文件  # 组中  # 几个  # 给你  # 都在  # 转换成  # 不加  # 转换为  # 可执行  # 大家多多  # 是否符合  # 过程中  # 文件传输  # 头文件  # png  # tif  # gif  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 在centOS 7安装mysql 5.7的详细教程  Laravel如何使用Sanctum进行API认证?(SPA实战)  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Swift中循环语句中的转移语句 break 和 continue  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  如何获取上海专业网站定制建站电话?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  javascript日期怎么处理_如何格式化输出  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何快速搭建FTP站点实现文件共享?  如何用AWS免费套餐快速搭建高效网站?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  HTML 中如何正确使用模板变量为元素的 name 属性赋值  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  JS中对数组元素进行增删改移的方法总结  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何实现用户密码重置功能?(完整流程代码)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何记录自定义日志?(Log频道配置)  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  深圳网站制作培训,深圳哪些招聘网站比较好?  如何用景安虚拟主机手机版绑定域名建站?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  javascript基于原型链的继承及call和apply函数用法分析  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  iOS UIView常见属性方法小结  iOS中将个别页面强制横屏其他页面竖屏  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  智能起名网站制作软件有哪些,制作logo的软件?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在阿里云域名上完成建站全流程?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何快速生成可下载的建站源码工具?