@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. 用 Java?试试国产框架 Solon v1.11.5(带视频)

    一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,没有 Servlet,没有 JavaEE:独立的轻量生态.主框架仅 0.1 MB. @Controller public ...

  2. python之实现文件的读写

    很早之前做自动化测试,并没有将测试数据与数据库关联,而是直接通过json.ymal.excel等文件管理的.那么怎么用python读写文件呢? 在操作文件前,都需要打开文件,打开文件用内置函数open ...

  3. git cherry-pick 同步修改到另一个分支

    我们在开发中有时会遇到,需要将另一个分支部分修改同步到当前分支. 如下图,想把 devA 分支中 commit E 和 F,同步到下面绿色的 devB 分支中. 这时候就可以使用 git cherry ...

  4. STL string常用API

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; ...

  5. Flutter异常监控 - 贰 | 框架Catcher原理分析

    前言 在给 Flutter 应用做异常监控的时候,一开始我是拒绝滴,如果不考虑 Flutter Engine 和 native 侧的监控,用我另一篇文章中不得不知道的 Flutter 异常捕获知识点 ...

  6. Web初级——JavaScript

    JavaScript JavaScript是一种基于对象的脚本语言,用于开发基于客户端和基于服务器的Internet应用程序 1.了解JS 1.1JavaScript的组成 JavaScript 的核 ...

  7. 聊聊web漏洞挖掘第一期

    之前写2022年度总结的时候,有提到要给大家分享漏洞挖掘技巧.这里简单分享一些思路,更多的内容需要大家举一反三. 文章准备昨晚写的,昨天晚上出去唱歌,回来太晚了,耽搁了.昨天是我工作的last day ...

  8. Atcoder dp I Coins 题解

    Atcoder链接:Coins Luogu链接:Coins $\scr{\color{BlueViolet}{Solution}}$ 观察数据,发现$ \cal{n} \le 3000 $,说明 $ ...

  9. flutter 2.X报错 Bad state: Insecure HTTP is not allowed by platform:

    flutter2.x开发遇到的问题 Bad state: Insecure HTTP is not allowed by platform: 翻译过来就是:错误状态:平台不允许不安全的HTTP: 产生 ...

  10. 双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG

    <template> <div class="mycanvas-container"> <vue-drag-resize :isActive = 't ...