判断用户上传文件的合法性仅仅通过后缀名是完全不够的,谁也不知道后缀名是否被更改,服务器保存一个不知道真实类型的文件有极大的风险。

因此需要后台进行进一步的文件类型校验,这里有两种情况:

  1)一般的文件类型例如:jpg、png、xlsx等等是有固定文件头的,提取出用户上传文件的文件头与固定文件头进行对比,就可以得到文件的准确类型。

  2)文本文件:txt、csv等等。文本文件具有特殊性,文本头无明显标志。但是文本文件百分百具有业务特殊性。可以在对文本进行格式验证时,判断是否为目标类型;或者通过编码校验,看文本是否正确编码,是否有乱码存在(正确编辑的文件,不可能存在乱码),有第三方插件cpdetector可以检测当前文件的编码;最后还可以通过提供文件模板,固定文本文件的头尾等方式来进行校验。

这里主要说明第一种情况,第二种文本情况根据业务具体环境不同,有不同的处理方式。

文件类型枚举?

package com.uti.utilEnum;public enum  FileTypeEnum {JPG("ffd8ffe000104a464946"),PNG("89504e470d0a1a0a0000"),GIF("47494638396126026f01"),TIF("49492a00227105008037"),BMP_1("424d228c010000000000"),//16色位图(bmp)BMP_2("424d8240090000000000"),//24位位图(bmp)BMP_3("424d8e1b030000000000"),//256色位图(bmp)DWG("41433130313500000000"),HTML("3c21444f435459504520"),HTM("3c21646f637479706520"),CSS("48544d4c207b0d0a0942"),JS("696b2e71623d696b2e71"),RTF("7b5c727466315c616e73"),PSD("38425053000100000000"),EML("46726f6d3a203d3f6762"),DOC("d0cf11e0a1b11ae10000"),VSD("d0cf11e0a1b11ae10000"),MDB("5374616E64617264204A"),PS("252150532D41646F6265"),PDF("255044462d312e350d0a"),RMVB("2e524d46000000120001"),RM("2e524d46000000120001"),FLV("464c5601050000000900"),F4V("464c5601050000000900"),MP4("00000020667479706d70"),MP3("49443303000000002176"),MPG("000001ba210001000180"),WMV("3026b2758e66cf11a6d9"),ASF("3026b2758e66cf11a6d9"),WAV("52494646e27807005741"),AVI("52494646d07d60074156"),MID("4d546864000000060001"),ZIP("504b0304140000000800"),RAR("526172211a0700cf9073"),INI("235468697320636f6e66"),JAR("504b03040a0000000000"),EXE("4d5a9000030000000400"),JSP("3c25402070616765206c"),MF("4d616e69666573742d56"),XML("3c3f786d6c2076657273"),SQL("494e5345525420494e54"),JAVA("7061636b616765207765"),BAT("406563686f206f66660d"),GZ("1f8b0800000000000000"),PROPERTIES("6c6f67346a2e726f6f74"),CLASS("cafebabe0000002e0041"),CHM("49545346030000006000"),MXP("04000000010000001300"),DOCX("504b0304140006000800"),WPS("d0cf11e0a1b11ae10000"),TORRENT("6431303a637265617465"),MOV("6D6F6F76"),WPD("FF575043"),DBX("CFAD12FEC5FD746F"),PST("2142444E"),QDF("AC9EBD8F"),PWL("E3828596"),RAM("2E7261FD");private String value = "";private FileTypeEnum(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

具体代码?

    private boolean notTextFileTypeCheck(InputStream inputStream, String specifiedType) throws IOException {boolean fileTypeIsVaild = false;byte[] buffer = new byte[10];inputStream.read(buffer);//获取当前文件的真实类型String curfileType = getTrueFileType(bytesToHexFileTypeString(buffer));//指定文件类型中是否匹配当前文件类型if(specifiedType.toUpperCase().equals(curfileType)){fileTypeIsVaild = true;}return fileTypeIsVaild;}private String getTrueFileType(String s) {for (FileTypeEnum fileTypeEnum : FileTypeEnum.values()) {if (s.startsWith(fileTypeEnum.getValue())) {return fileTypeEnum.toString();}}return null;}private String bytesToHexFileTypeString(byte[] buffer) {StringBuilder hexFileTypeStr = new StringBuilder();for (byte b : buffer) {String hexString = Integer.toHexString(b & 0xFF);if (hexString.length() < 2) {hexFileTypeStr.append("0");}hexFileTypeStr.append(hexString);}return hexFileTypeStr.toString();}

关于为什么要&0xFF,推荐一篇文章https://www.cnblogs.com/think-in-java/p/5527389.html,加上评论更好理解,还能回顾下“原码反码补码”的知识

转载于:https://www.cnblogs.com/wanshiming/p/10594483.html

Java上传文件格式判断相关推荐

  1. java 获取上传文件的格式_js和java获取上传文件的文件名以及上传文件格式判断...

    js获取文件名: //校验 function check(){ var fileType = $("#template").val(); //判断后缀是不是需要的文件类型 if(f ...

  2. java 上传文件注意事项

    java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...

  3. Java上传文件到数据库

    Java上传文件到数据库 首先在开始本文之前推荐一篇我非常喜欢的博主--孤傲苍狼的一篇相关博文. JavaWeb学习总结(五十)--文件上传和下载 http://www.cnblogs.com/xdp ...

  4. JAVA上传文件图片到服务器保存

    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的   我这是提交一个文件和类型 <div style="border: 1px solid ...

  5. Java上传文件到minio

    Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能.而且学习成本低,安装运维简单,开箱即用,提供 Java 客 ...

  6. 第三方存储系统(一):阿里云OSS云存储配置及Java上传接口设计

    第三方存储系统(一):阿里云OSS云存储配置及Java上传接口设计 项目开发中,为了实现静态资源分离,提高系统运行的速率和稳定性,我们会把资源文件剥离出项目系统.而搭建文件存储系统就成为了不可或缺的工 ...

  7. java上传文件到远程服务器(一)---HttpURLConnection方式

    我们在之前的文章 JavaWeb静态资源分离思路 中已经了解到要把文件上传到静态资源服务器有三种方式: java上传文件到ftp服务器(这个方案需要在静态资源服务器安装ftp服务) java使用Htt ...

  8. java上传文件图片到服务器保存,Java上传文件图片到服务器的方法

    这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...

  9. java上传视频代码下载_java 实现视频上传

    [实例简介] java上传视频转码播放的一个demo,实现java上传视频.转码.截图和播放功能 [实例截图] [核心代码] java视频上传,转码,播放实现 └── java视频上传,转码,播放实现 ...

  10. java上传文件功能_Java MemoryMapped文件的功能

    java上传文件功能 Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取. 内存映射文件可 ...

最新文章

  1. 能表示分数的计算机,分数计算器的实现
  2. Python脚本监控线上AMQ Number of Pending Messages数量
  3. Spring Boot 集成 Elasticsearch 实战
  4. 牛客网 牛客小白月赛1 C.分元宵-快速幂
  5. chrome腾讯视频网页版HTML5,谷歌浏览器无软件爬取腾讯视频源MP4视频
  6. 免费的音视频格式转换网站-ncm, qmc, mflac, mgg转mp3
  7. 房屋租赁合同主要内容是那些
  8. 黄一老师:管理者需要知道的“三多”和“三少”
  9. Linux Ubuntu下载
  10. 什么是CDN什么是高防CDN
  11. 阿里首席风险官刘振飞:聚安全人之力 为全社会赋能
  12. QQ游戏美女找茬外挂
  13. 计算机许可管理器服务器名称是什么意思,服务器客户端访问许可是什么意思
  14. CentOS(Linux) 安装VNC server服务 VNC下载
  15. 这台计算机现在在博物馆吗英语翻译,2018年12月英语六级翻译真题点评试卷二:博物馆(文都教育)...
  16. YOLO内卷时代如何选择模型?
  17. python 画频率分布直方图求平均数_Python绘制频率分布直方图
  18. 中国科学技术大学2020计算机拟录取,中国科学技术大学2021年硕士研究生拟录取名单...
  19. 高职副教授职称评定条件
  20. 【Android】SVG和VectorDrawable——相关格式转换

热门文章

  1. SolidWorks工程图中模板与格式的关系
  2. 数据库系统概念第6版第三章答案
  3. Composer Laravel 下载安装
  4. 0712CF解题报告
  5. vb中换行的几种方法
  6. 本特利177230-00-01-CN
  7. 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版
  8. 三菱FX3UFX2NFX1N PLC 模拟器模拟通信功能,模拟PLC实体
  9. ClearCase四大功能详述
  10. JAVA基础篇——JAVA运行环境(JDK、JRE、JVM)