用魔数严谨的判别文件类型:杜绝上传风险
在文件处理和管理中,确定文件的类型是一个常见的需求。虽然文件扩展名可以提供一些信息,但并不总是可靠的。魔数(Magic Numbers)是一种更为准确的方法,通过检查文件开头的特定字节序列来识别文件类型。本文将介绍如何在Java中实现使用魔数判断文件类型的功能。
什么是魔数?
魔数是文件格式的标识符,通常位于文件的开头部分。每种文件格式都有其独特的魔数。例如:
- JPEG 文件以
FF D8开头。 - PNG 文件以
89 50 4E 47开头。 - PDF 文件以
%PDF开头。 - ZIP 文件以
50 4B开头。
Java实现示例
public enum FileTypeEnum {/*** JPEG*/JPEG("JPEG", "FFD8FF"),/*** PNG*/PNG("PNG", "89504E47"),/*** GIF*/GIF("GIF", "47494638"),/*** TIFF*/TIFF("TIFF", "49492A00"),/*** Windows bitmap*/BMP("BMP", "424D"),/*** CAD*/DWG("DWG", "41433130"),/*** Adobe photoshop*/PSD("PSD", "38425053"),/*** Rich Text Format*/RTF("RTF", "7B5C727466"),/*** XML*/XML("XML", "3C3F786D6C"),/*** HTML*/HTML("HTML", "68746D6C3E"),/*** Outlook Express*/DBX("DBX", "CFAD12FEC5FD746F "),/*** Outlook*/PST("PST", "2142444E"),/*** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db*/OLE2("OLE2", "0xD0CF11E0A1B11AE1"),/*** Microsoft Word/Excel*/XLS_DOC("XLS_DOC", "D0CF11E0"),/*** Microsoft Access*/MDB("MDB", "5374616E64617264204A"),/*** Word Perfect*/WPB("WPB", "FF575043"),/*** Postscript*/EPS_PS("EPS_PS", "252150532D41646F6265"),/*** Adobe Acrobat*/PDF("PDF", "255044462D312E"),/*** Windows Password*/PWL("PWL", "E3828596"),/*** ZIP Archive*/ZIP("ZIP", "504B0304"),/*** ARAR Archive*/RAR("RAR", "52617221"),/*** WAVE*/WAV("WAV", "57415645"),/*** AVI*/AVI("AVI", "41564920"),/*** Real Audio*/RAM("RAM", "2E7261FD"),/*** Real Media*/RM("RM", "2E524D46"),/*** Quicktime*/MOV("MOV", "6D6F6F76"),/*** Windows Media*/ASF("ASF", "3026B2758E66CF11"),/*** MIDI*/MID("MID", "4D546864"),/*** xlsx*/XLSX("XLSX", "504B0304"),/*** xls*/XLS("XLS", "D0CF11E0A1B11AE1");private String key;private String value;FileTypeEnum(String key, String value) {this.key = key;this.value = value;}public String getValue() {return value;}public String getKey() {return key;}
}
import java.io.IOException;
import java.io.InputStream;public class FileUtils {/*** 获取文件头** @param inputStream 输入流* @return 16 进制的文件投信息* @throws IOException io异常*/private static String getFileHeader(InputStream inputStream) throws IOException {byte[] b = new byte[28];inputStream.read(b, 0, 28);return bytes2hex(b);}/*** 将字节数组转换成16进制字符串** @param src 文件字节数组* @return 16进制字符串*/private static String bytes2hex(byte[] src) {StringBuilder stringBuilder = new StringBuilder("");if (src == null || src.length <= 0) {return null;}for (byte b : src) {int v = b & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}/*** 判断指定输入流是否是指定文件格式** @param inputStream 输入流* @param fileTypeEnum 文件格式枚举* @return true 是;false 否* @throws IOException io异常*/public static boolean isFileType(InputStream inputStream, FileTypeEnum fileTypeEnum) throws IOException {if (null == inputStream) {return false;}String fileHeader = getFileHeader(inputStream);return fileHeader.toUpperCase().startsWith(fileTypeEnum.getValue());}public static void main(String[] args) {}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test {public static void main(String[] args) {File file = new File("D:/1.xlsx");try (FileInputStream fileInputStream = new FileInputStream(file)) {if (FileUtils.isFileType(fileInputStream, FileTypeEnum.XLSX) || FileUtils.isFileType(fileInputStream, FileTypeEnum.XLS)) {System.out.println("文件类型匹配");} else {System.out.println("文件类型不匹配");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}相关文章:
用魔数严谨的判别文件类型:杜绝上传风险
在文件处理和管理中,确定文件的类型是一个常见的需求。虽然文件扩展名可以提供一些信息,但并不总是可靠的。魔数(Magic Numbers)是一种更为准确的方法,通过检查文件开头的特定字节序列来识别文件类型。本文将介绍如何在…...
【MacOS实操】如何基于SSH连接远程linux服务器
MacOS上远程连接linux服务器,可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件,则跳过这一步。如果手上有ppk文件,那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式,你需要将 PPK 文…...
EXPLAIN 针对性优化 SQL 查询
在数据库管理和应用中,高效的 SQL 查询是确保系统性能的关键。随着数据量的不断增长和业务需求的日益复杂,优化 SQL 查询变得尤为重要。而 EXPLAIN 命令是一种强大的工具,可以帮助我们深入了解 SQL 查询的执行计划,从而进行有针对…...
MR30分布式IO:石化行业的智能化革新
在浩瀚的工业领域中,石化行业如同一座巨大的化工厂,将自然界的原始资源转化为人们日常生活中不可或缺的各种产品。然而,随着生产规模的扩大和工艺复杂度的提升,石化行业面临着前所未有的挑战:如何在保证生产效率的同时…...
linux图形化X窗口
【linux图形化协议框架】 X、X11系统:X协议,X服务器,窗口管理器,X客户端(客户端库Xcb,Xlib库等),输入、绘制 Wayland系统:Wayland 协议,合成器、客户端&#…...
练习LabVIEW第三十五题
学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第三十五题: 使用labview模拟一个3-8译码器 开始编写: 用LabVIEW做3-8译码器首先要知道它是个啥…...
Decision Tree Regressor (决策树) --- 论文实战
一、前言 在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址) 这里我们不做前期处理,直接就将数据放入 DecisionTreeRegressor 模型中进行训练了。 二…...
三层交换技术,eNSP实验讲解
三层交换技术,eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、应用场景5、与路由器的区别 二、eNSP仿真实验1、步骤一:创建连接,明确参数。2、步骤二:设置PC1和PC2参数3、步骤三:配置交换机,通过命…...
单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路: 合并两个有序链表:首先创建新链表的头节点(哨兵位:本质上是占位子),为了减少一些判断情况,简化操作。然后我们…...
研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!
小绿书作为今年最大的红利,很多人已经吃到了螃蟹。看——: 今天我们总结了100个10万爆款,我们发现要在这个平台上脱颖而出,找到属于自己的方法尤为重要。在这里分享一个主题——小绿书的秘诀就是“先抄后超,持续出摊”…...
Java 中 HashMap集合使用
目录 一. HashMap概述 二. HashMap特点 三. HashMap构造方法 四. HashMap的常用方法 五. 使用注意事项 六. 代码示例 一. HashMap概述 HashMap 是 Java 中的一个非常重要的类,它实现了 Map 接口,用于存储键值对(key-value pairs&#…...
#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
平台化运营公司如何在创业市场招商
在当今商业环境中,平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言,在创业市场招商意义重大。 平台化运营公司具有独特特点:通过搭建开放共享平台连接供需双方,实现资源优化配置与价值创造。比如电子商务平台、社…...
飞书API-获取tenant_access_token
1.在飞书工作台创建应用,跳到开发者后台,选创建企业自建应用 2.设置并发布应用 必须要发布应用才可以开始使用了!!! 3.调用获取token的API 参考链接: 开发文档 - 飞书开放平台https://open.feishu.cn/do…...
(新)docker desktop镜像迁移
背景 docker desktop默认安装在系统c盘,久而久之随着镜像拉取的越多,系统盘占用则越来越大。现有的网络资源关于docker desktop迁移都是旧版本的,即4.30版本之前。在4.30版本及以后,在运行wsl -l -v时只有docker-desktop只有这一项…...
单向函数、单向陷门函数、困难问题
1、单向函数 设函数 yf(x) , 对于给定的x,计算出y很容易;对于给定的y,计算出x很难。 2、单向陷门函数 设函数 yf(x) ,且f有陷门, 对于给定的x,计算出y很容易;对于给定的y&#…...
MYSQL 小猫钓鱼 - 猫王争霸之〈主从设计〉
在美丽的森林中,小猫们的钓鱼大赛依旧热闹非凡,而 “猫王争霸” 的竞争也越来越激烈。随着时间的推移,越来越多的动物们开始关注这场有趣的比赛,对鱼表数据的查询请求也急剧增加。 一、请求压力剧增 花猫看着鱼表发愁道…...
arcgis坐标系问题
2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据(影像图),如果打开80的数据则会投影错误,出现较大偏差。 解决方案:80数据框打开80数据,2000数据库打开2000数据。...
ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题
下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…...
【软考】RUP相关考点总结
RUP,是一个重量级过程,提供一个在线指导,为所有方面提供指导方针。 关于RUP(统一软件开发过程)的9个核心工作流,如果考试中出现,可能会以以下几种方式进行考察: 定义和描述ÿ…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
