@FileLimit – AOP最佳实践:上传文件大小限制
@FileLimit 结构分析

1、FileLimitUnit 定义枚举:文件的单位
public enum FileLimitUnit {
KB, MB, GB
}
2、定义注解
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.*;
/**
* @Author :zanglk
* @DateTime :2022/1/25 09:49
* @Description :FileLimit 注解,内置参数value,max,以及文件单位
* @Notes :To change this template:Click IDEA-Preferences to search 'File Templates'
*/
@Documented
@Target(ElementType.METHOD) // 作用与方法上
@Retention(RetentionPolicy.RUNTIME) // RUNTIME: 在运行时有效(即运行时保留)
public @interface FileLimit {
@AliasFor("max") // @AliasFor 表示其可与max互换别名:当注解指定value时,为max赋值
int value() default 5;
// 定义单个文件最大限制
@AliasFor("value") // @AliasFor 表示其可与value互换别名:当注解指定max是,为value赋值
int max() default 5;
// 文件单位,默认定义为MB
FileLimitUnit unit() default FileLimitUnit.MB;
}
3、注解使用
任意方法添加,如果不传入value,就使用注解默认值5。
@FileLimit(value = 25,unit = FileLimitUnit.MB)
@FileLimit(unit = FileLimitUnit.MB)
@FileLimit
4、AOP拦截控制
注意 AOP拦截我在输出异常信息时,转换了文件大小,所以我使用我自己的工具类,这里我就不贴代码了。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Aspect
@Component
public class FileLimitAop {
// 定义默认的单个文件最大限制 5MB 。5Mb = 5 * 1024 * 1024 byte
private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;
// 注意,这里要指定注解的全限定类名。不然无法进入AOP拦截自定义注解FileLimit
@Pointcut("@annotation(com.zanglikun.springdataredisdemo.aop.fileLimitAop.FileLimit)")
public void pointcut() {
}
/**
* 方法体执行之前执行
*/
@Before("pointcut()")
public void beforeLog(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
FileLimit annotation = AnnotationUtils.getAnnotation(signature.getMethod(), FileLimit.class);
if (null == annotation) {
return;
}
// 执行文件检查
fileSizeLimit(joinPoint, annotation);
}
// 判定文件大小是否合格,如果不合格,直接跑出自定义异常FileLimitException。进而阻塞方法正常进行。
private void fileSizeLimit(JoinPoint joinPoint, FileLimit annotation) {
// 获取AOP签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// 获取注解的指定最大文件大小
long maxFileSize = getAnnotationMaxFileSize(annotation);
// 通过AOP签名 获取接口参数,调用方法获取文件
MultipartFile multipartFile = getMultipartFile(signature.getParameterNames(), signature.getParameterTypes(), joinPoint.getArgs());
if (null != multipartFile) {
if (0 == multipartFile.getSize()) {
throw new FileLimitException("文件数据(大小为0)异常.");
}
if (multipartFile.getSize() > maxFileSize) {
String msg = "文件大小不得超过 " + annotation.max() + annotation.unit().toString();
throw new FileLimitException(msg+" ,当前文件大小是 "+FileSizeOut.printFileSize(multipartFile.getSize()));
}
}
}
// 获取使用注解指定最大文件大小。如果没有指定文件大小,就用默认值
public long getAnnotationMaxFileSize(FileLimit fileLimit) {
if (null == fileLimit) {
return MAX_FILE_SIZE;
}
switch (fileLimit.unit()) {
case MB:
return (long) fileLimit.max() * 1024 * 1024;
case KB:
return (long) fileLimit.max() * 1024;
default:
return MAX_FILE_SIZE;
}
}
// 使用AOP获取目标请求方法携带的参数。我们当前只需要解析File
private MultipartFile getMultipartFile(String[] paramNames, Class[] paramTypes, Object[] paramObjs) {
for (int i = 0; i < paramNames.length; i++) {
if (paramTypes[i] != MultipartFile.class) {
continue;
}
return (MultipartFile) paramObjs[i];
}
return null;
}
}
测试
测试前,请添加或修改配置文件,避免因为Servlet大小限制了。
# 限制Tomcat Servlet单文件大小、以及总请求大小,-1则不限制!
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
@RestController
@RequestMapping("/testFileLimit")
public class TestFileLimit {
@RequestMapping("/upload")
//@FileLimit(value = 25,unit = FileLimitUnit.MB)
//@FileLimit(unit = FileLimitUnit.MB)
@FileLimit
public void upLoad(MultipartFile file) {
System.out.println("请求进入喽");
}
}
我上传一个视频文件461.0MB
2022-10-25 12:55:56.245 ERROR 42691 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.zanglikun.springdataredisdemo.aop.FileLimitException: 文件大小不得超过 5MB ,当前文件大小是 461.0MB] with root cause
com.zanglikun.springdataredisdemo.aop.FileLimitException: 文件大小不得超过 5MB ,当前文件大小是 461.0MB
拦截成功!完结 !
@FileLimit – AOP最佳实践:上传文件大小限制的更多相关文章
- 解决phpmyadmin上传文件大小限制的配置方法
解决phpmyadmin上传文件大小限制的配置方法 phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要phpmya ...
- 解决ASP.NET上传文件大小限制
第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改 ...
- 兼容各浏览器的js判断上传文件大小
由于项目需要,在网上找了一个JS判断上传文件大小的程序,经测试兼容IE6-,Firefox10,Opera11.,safari5.,chrome17 <!DOCTYPE html> < ...
- 【荐】PHP上传文件大小限制大全
在php.ini里面可以设置最大上传文件大小 解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M post_max_size = 10M memor ...
- nginx:413 Request Entity Too Large 及 修改 PHP上传文件大小配置
开发环境:CentOS + Nginx + PHP + MySql + phpMyAdmin 在用 phpMyAdmin 进行 sql 数据库导入的时候,经常需要上传比较大的 sql 数据文件,而这时 ...
- 修改PHP上传文件大小限制的方法
感谢分享,原文地址:http://www.cnblogs.com/newsouls/archive/2012/12/27/2835628.html 修改PHP上传文件大小限制的方法1. 一般的文件上传 ...
- php.ini修改php上传文件大小限制的方法详解
打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就 ...
- php上传文件大小限制修改
打开php.ini 1.最大上传文件大小: upload_max_filesize=2M 改成自己需要的大小 2.最大post大小: post_max_size=2M 改成自己需要的大小,第二个一般比 ...
- 修改apache上传文件大小限制
PHP上传文件大小限制解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M post_max_size = 10M memory_limi ...
- wordpress修改上传文件大小限制
在为有的客户搭建 WordPress 网站时,有时会遇到因为所在的服务器限制了上传文件大小而无法上传较大的附件,WordPress的媒体文件上传可以看到,大多数都是2MB或者8MB.如果是图片的话可能 ...
随机推荐
- python 之定时任务(schedule)
import schedule import time def job(): print("定时通报...") # 定义一个叫job的函数,函数的功能是打印'定时通报...' sc ...
- 或许是市面上最强的 Mock 工具
背景 在开发过程中,由于后端与前端并行开发,或者前端需要等待后台开发,难以保证对接效率,同时即使用开发好的 API 对接,也有可能一个 API 不通就阻塞了整个软件的对接工作.同时对软件的敏感度也很高 ...
- 万字长文详解 YOLOv1-v5 系列模型
一,YOLOv1 Abstract 1. Introduction 2. Unified Detectron 2.1. Network Design 2.2 Training 2.4. Inferen ...
- 【爬虫+数据分析+数据可视化】python数据分析全流程《2021胡润百富榜》榜单数据!
目录 一.爬虫 1.1 爬取目标 1.2 分析页面 1.3 爬虫代码 1.4 结果数据 二.数据分析 2.1 导入库 2.2 数据概况 2.3 可视化分析 2.3.1 财富分布 2.3.2 年龄分布 ...
- GeoLayout: Geometry Driven Room Layout Estimation Based on Depth Maps of Planes
1. 论文简介 论文题目:GeoLayout: Geometry Driven Room Layout Estimation Based on Depth Maps of Planes Paper地址 ...
- [Java]内存回收机制框架图
具体解释下面这篇博客总结的已经非常好了,我就不复制了: http://www.cnblogs.com/cielosun/p/6674431.html#12-%E5%8F%AF%E8%BE%BE%E6% ...
- [Leetcode] 寻找数组的中心索引
题目 代码 class Solution { public: int pivotIndex(vector<int>& nums) { int right=0; for(auto i ...
- 51NOD5213A 【提高组/高分-省选预科 第一场【M】】序列
小 Y 酷爱的接龙游戏正是这样.玩腻了成语接龙之后,小 Y 决定尝试无平方因子二元合数接龙,规则如下: 现有 \(n\) 个不超过 \(K\) 的合数,每个合数 \(a\) 均可表示为 \(a=pq( ...
- Less常用功能使用
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充.Less 可以运行在 Node 或浏览器端. L ...
- 通过Docker启动Solace,并在Spring Boot通过JMS整合Solace
1 简介 Solace是一个强大的实时性的事件驱动消息队列.本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没有使用相关starter,跟Spring的整合一样,可通用 ...