通过后缀名和MIME-TYPE检查实现文件类型校验
前言
文件上传是一个在开发中很常见的需求场景,通常出于安全考虑,我们会对上传的文件进行类型校验,其中常见的有后缀名校验,mime-type校验
话不多说,直接上代码
1.首先定义允许上传的文件类型白名单
private static final String[] suffixWhiteList = {"PNG","JPEG","JPG","GIF"};
private static final String[] mimeTypeWhiteList = {"image/jpeg","image/gif","image/png"};
2.后缀名校验
/**
* 文件后缀名校验
*
* @param fileName
* 文件名称
* @return
*/
public static boolean suffixCheck(String fileName) {
if(fileName == null || "".equals(fileName)){
return false;
}
//从最后一个点之后截取字符串
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
//白名单匹配
boolean anyMatch = Arrays.stream(suffixWhiteList).anyMatch(x -> x.equalsIgnoreCase(suffix));
return anyMatch;
}
3.mime-type校验,因为需要获取文件的mimeType,我引入了第三方的jar包(其他同样功能的jar包都可以)
//MIME-TYPE工具包
compile("net.sf.jmimemagic:jmimemagic:0.1.3")
/**
* MIMETYPE校验
* @return
*/
public static boolean mimeTypeCheck(MultipartFile uploadFile){
if (uploadFile.isEmpty()){
return false;
}
//文件名
String fileName = uploadFile.getOriginalFilename();
// 获取文件后缀
String suffix=fileName.substring(fileName.lastIndexOf("."));
File picFile = null;
try {
// 用uuid作为文件名,防止生成的临时文件重复
picFile = File.createTempFile(UuidUtils.getUuid(), suffix);
FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),picFile);
// MultipartFile to File
MagicMatch match = Magic.getMagicMatch(picFile, false);
String mimeType = match.getMimeType();
// 白名单匹配
boolean anyMatch = Arrays.stream(mimeTypeWhiteList).anyMatch(x -> x.equalsIgnoreCase(mimeType));
return anyMatch;
} catch (IOException e) {
LOGGER.error("生成临时文件异常",e);
} catch (Exception e) {
LOGGER.error("MIME-TYPE检查发生异常",e);
} finally {
//程序结束时,删除临时文件
if (picFile.exists()){
picFile.delete();
}
}
return false;
}
通过后缀名和MIME-TYPE检查实现文件类型校验的更多相关文章
- input type="file"指定文件类型为excel
指定上传类型为excel:加上accept="application/vnd.ms-excel"即可,只兼容chrome跟ff,不兼容ie <input type=" ...
- 既然有文件后缀名,为何还需要MIME类型?
作者:Vincross链接:https://www.zhihu.com/question/60495696/answer/204530120来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- Linux下的文件及文件后缀名
Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...
- [笔记] C# 如何获取文件的 MIME Type
MIME Type 为何物: MIME 参考手册 svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types 常规方式 对于有文件后 ...
- C#文件后缀名详解
C#文件后缀名详解 .sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:W ...
- BAT-批量改文件后缀名
问题现象:在处理一个目录时,发现JPG文件都是以TMP文件命名的.双击打不开.要手动改一个为JPG. 问题处理: 1.新建一个TXT文件,内容写如下: ren *.tmp *.jpg 2.把TXT改为 ...
- os模块、文件压缩 、匹配文件后缀名:fnmatch glob
一.os模块 os模块:是python是系统交互的模块 import os # 0平台信息的一些操作 python是夸平台的,所以内部兼容了不同的平台 1. os.name # 操作系统 nt是win ...
- python3批量修改文件后缀名
import os # 原文件后缀名 suffix_name = '.jar.src.zip' # 新文件后缀名 nwe_suffix_name = '.jar' def foo(path1): fi ...
- Android 各种MIME类型和文件类型的匹配表
MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后 ...
随机推荐
- .NET Core微服务之ASP.NET Core on Docker
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...
- 【Android Studio安装部署系列】三十四、将Eclipse项目导入到Android Studio中
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 我采用的是笨方法:新创建Android Studio项目,然后将Eclipse项目中的目录一一复制到Android Studio项目 ...
- Asp.Net Core 轻松学-利用文件监视进行快速测试开发
前言 在进行 Asp.Net Core 应用程序开发过程中,通常的做法是先把业务代码开发完成,然后建立单元测试,最后进入本地系统集成测试:在这个过程中,程序员的大部分时间几乎都花费在开发.运行 ...
- 微服务之consul(一)
一.概述 consul是google开源的一个使用go语言开发的服务发现.配置管理中心服务.内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依 ...
- 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南
RT Flash English | 中文 1 软件概览 1.1 介绍 RT-Flash是一个专为基于NXP i.MX RT系列芯片的产品量产而设计的工具,其功能与官方MfgTool2工具类似,但是解 ...
- Web前端-CSS必备知识点
Web前端-CSS必备知识点 css基本内容,类选择符,id选择符,伪类,伪元素,结构,继承,特殊性,层叠,元素分类,颜色,长度,url,文本,字体,边框,块级元素,浮动元素,内联元素,定位. 链接: ...
- SAP MM 明明有需求,为啥MRP RUN后没有PR单据产生?
SAP MM 明明有需求,为啥MRP RUN后没有PR单据产生? 用户报了一个问题说,对于物料号42011222的采购单 4500000156建好了,为啥PR没有自动生成 . 我们检查了物料的MRP ...
- 【AO笔记】有关使用AO基于shp文件创建网络数据集的一个细节
前些日子,和群友交流时提及shp文件创建单一网络数据集的创建问题. 由于项目需求,用shp文件创建网络合适,所以不得不去找一些古老的代码资料... 以前的研究中,创建网络数据集是根据IDatasetC ...
- promise原理
简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...
- Redis笔记-集群搭建
Redis单机版搭建上一篇已经基本介绍了,下面讨论Redis集群搭建方案和示例. 1.关于Redis常用的集群方案(三种): a.一主多从,如一个Master.两个Slave b.薪火相传,即集群中的 ...