@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最佳实践:上传文件大小限制的更多相关文章

  1. 解决phpmyadmin上传文件大小限制的配置方法

    解决phpmyadmin上传文件大小限制的配置方法 phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要phpmya ...

  2. 解决ASP.NET上传文件大小限制

    第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改 ...

  3. 兼容各浏览器的js判断上传文件大小

    由于项目需要,在网上找了一个JS判断上传文件大小的程序,经测试兼容IE6-,Firefox10,Opera11.,safari5.,chrome17 <!DOCTYPE html> < ...

  4. 【荐】PHP上传文件大小限制大全

    在php.ini里面可以设置最大上传文件大小 解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M post_max_size = 10M memor ...

  5. nginx:413 Request Entity Too Large 及 修改 PHP上传文件大小配置

    开发环境:CentOS + Nginx + PHP + MySql + phpMyAdmin 在用 phpMyAdmin 进行 sql 数据库导入的时候,经常需要上传比较大的 sql 数据文件,而这时 ...

  6. 修改PHP上传文件大小限制的方法

    感谢分享,原文地址:http://www.cnblogs.com/newsouls/archive/2012/12/27/2835628.html 修改PHP上传文件大小限制的方法1. 一般的文件上传 ...

  7. php.ini修改php上传文件大小限制的方法详解

    打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就 ...

  8. php上传文件大小限制修改

    打开php.ini 1.最大上传文件大小: upload_max_filesize=2M 改成自己需要的大小 2.最大post大小: post_max_size=2M 改成自己需要的大小,第二个一般比 ...

  9. 修改apache上传文件大小限制

    PHP上传文件大小限制解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M    post_max_size = 10M    memory_limi ...

  10. wordpress修改上传文件大小限制

    在为有的客户搭建 WordPress 网站时,有时会遇到因为所在的服务器限制了上传文件大小而无法上传较大的附件,WordPress的媒体文件上传可以看到,大多数都是2MB或者8MB.如果是图片的话可能 ...

随机推荐

  1. json提取器和beanshell处理器组合,将提取的所有id以数组返回

    1.添加json提取器 2.添加beanshell处理器,并编写脚本 String str1 = vars.get("buildid_ALL"); log.info(str1); ...

  2. JavaScript:this指针

    this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域: 而这个内存区域,保存的就是一个对象的数据,那么这个对象是什么呢? 通常来说,this指针,主要是用在方法(函数)中,用来指向调用方 ...

  3. 用Echarts实现SpreadJS引用从属关系可视化

    在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单元格,而且会有会有多级依赖的情况,如果让我们的从业人员靠眼睛找,工作量巨大,而且准确性存疑,基本上死路一条 ...

  4. 结合商业项目深入理解Go知识点

    这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了.建议先收藏,慢慢看. 前言 上一篇文章 #[Go WEB进阶实战]开源的电商前后台API系统 很受大家欢迎,有好多小伙伴私信我问题:&quo ...

  5. 微服务框架——SpringBoot

    SpringBoot 1.创建Boot项目的两种方式 1.1通过spring网站创建 进入Spring Initializr 选择填写对应配置,打包 将zip格式的压缩包解压,并导入该项目 1.2 通 ...

  6. PyTorch如何加速数据并行训练?分布式秘籍大揭秘

    PyTorch 在学术圈里已经成为最为流行的深度学习框架,如何在使用 PyTorch 时实现高效的并行化? 在芯片性能提升有限的今天,分布式训练成为了应对超大规模数据集和模型的主要方法.本文将向你介绍 ...

  7. 面试官:JVM是如何判定对象已死的?

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 知道的越多,才知知道的越少.--苏格拉底 目录 引用计数算法 可达性分析算法 引用类型 ...

  8. 如何将WebAssembly优化到2MB?

    Blazor WebAssembly加载优化方案 对于Blazor WebAssembly加载方案的优化是针对于WebAssembly首次加载,由于BlazorWebAssembly是在首次加载的时候 ...

  9. 修改hosts文件需要vi命令

    i 在光标前插入. 保存 按esc后 shift+: 输入wq! 保存

  10. 【Android 4.4】内存文件系统(tmpfs)的创建与使用

    前言说明 某些情况下,需要缓存一些文件到磁盘中,我们可以借助 tmpfs 文件系统,来提升读写缓存文件的速度,并且也可以避免频繁读写缓存文件所带来的对 flash 的寿命影响. 使用方法 通过 mkd ...