SpringBoot项目文件上传校验工具类

功能介绍

`FileValidationUtils`是一个工具类,主要用于验证上传的文件。以下是其主要功能和特点:

1. 文件类型验证:`FileValidationUtils`类中定义了一个`MIME_TYPE_MAP`,这个映射表包含了允许上传的文件类型和对应的MIME类型。在`validateFile`方法中,会检查上传的文件的MIME类型是否在这个映射表中,如果不在,就抛出异常。

2. 文件扩展名和MIME类型匹配验证:`validateFile`方法会获取上传的文件的扩展名,并在`MIME_TYPE_MAP`中查找这个扩展名对应的MIME类型。然后,它会检查这个MIME类型是否和文件的实际MIME类型匹配,如果不匹配,就抛出异常。

3. 文件内容验证:`validateFile`方法会读取上传的文件的前几个字节,然后使用`FileMagic`类来判断文件的类型。然后,它会检查这个文件类型是否和文件的扩展名匹配,如果不匹配,就抛出异常。

4. 异常处理:如果在验证过程中发现任何问题,`validateFile`方法会抛出一个异常。这个异常可以在调用`validateFile`方法的地方被捕获,并进行相应的错误处理。

使用了Spring的`MultipartFile`类来处理上传的文件,在设计和实现上,我都遵循了Java的最佳实践,包括使用常量来定义允许的文件类型,使用映射表来查找文件类型,使用异常来处理错误等。

FileValidationUtils代码

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;import org.apache.poi.poifs.filesystem.FileMagic;
import org.springframework.web.multipart.MultipartFile;public class FileValidationUtils {private static final Map<String, String> MIME_TYPE_MAP = new HashMap<>();public static final IllegalArgumentException INVALID_FILE_SIGNATURE = new IllegalArgumentException("Invalid file signature");static {MIME_TYPE_MAP.put("png", "image/png");MIME_TYPE_MAP.put("jpeg", "image/jpeg");MIME_TYPE_MAP.put("jpg", "image/jpeg");MIME_TYPE_MAP.put("pdf", "application/pdf");MIME_TYPE_MAP.put("doc", "application/msword");MIME_TYPE_MAP.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");MIME_TYPE_MAP.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");}public static void validateFile(MultipartFile file) {String contentType = file.getContentType();if (!MIME_TYPE_MAP.containsValue(contentType)) {throw new IllegalArgumentException("Invalid content type");}String extension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);String expectedMimeType = MIME_TYPE_MAP.get(extension);if (!expectedMimeType.equals(contentType)) {throw new IllegalArgumentException("Mimetype does not match file extension");}FileMagic fileMagic;try (InputStream is = new BufferedInputStream(file.getInputStream())) {fileMagic = FileMagic.valueOf(is);} catch (IOException e) {throw new IllegalArgumentException("Invalid file");}switch (fileMagic) {case OOXML:if (!Arrays.asList("docx", "xlsx").contains(extension)) {throw INVALID_FILE_SIGNATURE;}break;case OLE2:if (!"doc".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;case JPEG:if (!Arrays.asList("jpg", "jpeg").contains(extension)) {throw INVALID_FILE_SIGNATURE;}break;case PNG:if (!"png".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;case PDF:if (!"pdf".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;default:throw new IllegalArgumentException("Unsupported file type");}}
}

推荐阅读下面文章,通过注解来使用文件校验工具类,统一处理SpringBoot项目的文件上传校验。





SpringBoot项目文件上传校验(注解版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

package.json的配置

package.json的配置参考 package.json文件是Node.js项目中的一个重要配置文件&#xff0c;用于存储项目的元数据和各种配置信息。 以下是一些常见的 package.json配置项&#xff1a; { "name": "my-project", // 项目名称&#xff0c;遵循npm的命名规范…

新人学习笔记之(JavaScript运算符)

目录 一、运算符 1.运算符&#xff08;operator&#xff09;也被称操作符&#xff0c;最用于实现赋值、比较和算数运算等功能的符号。 2.javascript中常用的有 二、算术运算符 1.算数运算符概述 2.浮点数的精度问题 3.表达式和返回值 三、递增和递减运算符 1.递增和递减运算符…

Python使用MQTT连接新版ONENet

Python MQTT 连接新版ONENet 简介 前几个教程我们使用mqtt.fx连接了新版的ONENet, 只是跑通了MQTT协议&#xff0c;但是在实际操作下还需要实现具体环境、具体设备的MQTT连接&#xff0c;本章教程将以Python MQTT的方式连接 ONENet 参考文档&#xff1a; paho-mqtt PyPI …

数据结构 顺序表

目录 1. 什么是数据结构&#xff1f;2. 顺序表2.1 线性表2.2 顺序表 3. 动态顺序表的实现 正文开始 1. 什么是数据结构&#xff1f; 在学习顺序表前&#xff0c;我们先来了解一下什么是数据结构&#xff1a;数据结构是计算机存储、组织数据的方式&#xff0c;具有一定逻辑关系…

ffprobe 使用文档介绍

ffprobe 摘要 命令格式:ffprobe [options] input_url功能:ffprobe 是一个多媒体分析工具,用于收集多媒体流中的信息,并以易于人类阅读和机器解析的方式打印出来。ffprobe 描述 信息收集:可以检查多媒体流使用的容器格式以及其中每个媒体流的格式和类型。URL 输入:如果输入…

用了那么久的可道云teamOS,居然才发现这个隐藏的功能:一键存图,无需下载

在日常的工作或学习中&#xff0c;我们在遇到喜欢的图片时&#xff0c;总会想要保存下来以备后用。 然而&#xff0c;传统的图片保存方式通常需要我们右键另存为&#xff0c;或者复制链接、打开下载工具&#xff0c;甚至可能需要跳转到其他应用或网页才能完成下载。 存在电脑本…

数据整理的Compact流程 (二)|OceanBase数据转储合并技术解读(二)

上篇文章《数据整理的Compact流程 &#xff08;一&#xff09;&#xff5c;OceanBase数据转储合并技术解读&#xff08;二&#xff09;》中&#xff0c;有讲解到&#xff0c;在OceanBase数据库中&#xff0c;当MemTable写满时&#xff0c;将其下刷到Mini SSTable的过程包含两个…

ubuntu移动硬盘重命名

因为在ubuntu上移动硬盘的名字是中文的&#xff0c;所以想要改成英文的。 我的方法&#xff1a; 将移动硬盘插到windows上&#xff0c;直接右键重命名。再插到ubuntu上名字就改变了。 别人的方法&#xff1a; ubuntu下如何修改U盘名字-腾讯云开发者社区-腾讯云 在自带的软件…

盘点10大灵动惊艳小演员❗谁是你的心头好?

盘点国内影视那些惊艳观众的小演员们无疑为影视作品注入了新的活力。以下是10个备受赞誉的小演员&#xff1a; 1.韩昊霖&#xff1a;凭借在《我和我的祖国》和《庆余年》中的出色表现 韩昊霖的演技赢得了观众和业界的广泛认可 他能够准确地把握角色的情感和细节&#xff0c;展…

海外大带宽云服务器有哪些优势

海外大带宽云服务器是指位于海外数据中心&#xff0c;提供高速网络连接和大量数据传输能力的云计算服务器。Rak部落小编为您整理发布海外大带宽云服务器的相关信息。 具体分析如下&#xff1a; 1. **全球覆盖与低延迟 - **广泛的地域布局**&#xff1a;在全球范围内建立了多个数…

雷达基数据绘制成雷达图

x波段雷达基数据绘制成雷达图 1.雷达基数据格式Z_RADR_I_ZR001_20240521020002_O_DOR_YLD2-D_CAP_FMT.bin.bz2 2.基数据读取 python f StandardData(i) # 新版本标准数据radarTime f.scantime # 获取雷达时次date_str radarTime.strftime(%Y-%m-%d %H:%M:%S)date_str d…

832. 翻转图像 - 力扣

1. 题目 给定一个 n x n 的二进制矩阵 image &#xff0c;先 水平 翻转图像&#xff0c;然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转&#xff0c;即逆序。 例如&#xff0c;水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转图片的意思是图片中的 0 全部被…

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中&#xff0c;H264数据流一般来自芯片内部的硬编码器&#xff0c; AAC音频数据则是通过采集PCM进行软编码&#xff0c;但是如何对它实时进行封装多媒体文件 &#xff0c;参考ffmpeg example&#xff0c;花了一些时间终于实现了该功能。 流程图如下&#xf…

【Pandas】深入解析`pd.read_pickle()`函数

【Pandas】深入解析pd.read_pickle()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&…

【动态规划-背包模型part4(混合背包问题、背包问题方案数量)】:混合背包问题、机器分配、背包问题求方案数【已更新完成】

题目类型混合背包问题混合背包问题机器分配背包问题方案数量背包问题求方案数背包问题方案数量 1、混合背包问题 有 N 种物品和一个容量是 V 的背包。 物品一共有三类&#xff1a; 第一类物品只能用1次&#xff08;01背包&#xff09;&#xff1b; 第二类物品可以用无限次&…

Ora-32004错误处理

问题现象 处理方法 观察alert会发现报错的参数在加载spfile的阶段 按照mos的方法对其reset 重新启动无报错 观察日志无报错

六(2)、RTKLIB源码解析 — postpos.c

目录 一、主要流程 二、主体代码 三、主要调用函数解析 3.1 openses() 3.2 closeses() 3.3

Unity学习笔记---资源管理

素材存放 Resources目录 在Assets的任何子目录下创建Resources目录&#xff0c;Unity会自动检索到这些目录并使用。该目录主要用于加载资源&#xff0c;将需要加载的资源放在该目录下。 该目录的内容大小不能超过2G TextAsset类 ScriptableObject类 AssetDatabase类 Pla…

c++多线程异常

在C中&#xff0c;捕获线程抛出的异常需要特别注意&#xff0c;因为默认情况下&#xff0c;如果一个线程抛出异常并且没有被捕获&#xff0c;整个程序可能会终止。为了安全地捕获和处理线程中的异常&#xff0c;可以考虑以下方法&#xff1a; 方法一&#xff1a;在线程函数中使…

ora-00392 ora-00312错误处理

检查当前日志组状态 对日志组进行clear操作 重新开库无报错