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


    需求

    要实现了一个文件上传和验证的功能,具有以下特点:

    1. 自定义注解:`FileValidation`注解用于标记需要进行文件验证的方法。

    2. 文件验证拦截器:`FileValidationInterceptor`拦截器会在每个请求处理之前被调用。如果请求处理的方法上有`FileValidation`注解,那么拦截器会获取请求中的文件,并进行验证。

    3. 文件验证:文件验证的逻辑在`FileValidationUtils`的`validateFile`方法中实现。这个方法会检查文件的MIME类型和文件扩展名是否匹配,以及文件的内容是否符合预期的文件格式。

    4. 支持单个和多个文件上传:在`Controller`中,`upload`方法接受一个`MultipartFile`参数,表示上传的文件。在`FileValidationInterceptor`中,拦截器会检查请求中是否有名为"file"的参数,如果有,就获取这个参数并进行验证。同时,拦截器也支持多个文件上传,它会检查请求中是否有名为"files"的参数,如果有,就获取这个参数(一个文件列表),并对列表中的每个文件进行验证。

    5. 错误处理:如果文件验证失败,`validateFile`方法会抛出一个异常。在`FileValidationInterceptor`中,如果捕获到这个异常,拦截器会停止请求的处理,并返回一个错误响应。

    在Spring Boot中,拦截器和注解是常用的技术,用于实现各种复杂的功能。以下代码的设计和实现都遵循了Spring Boot的最佳实践。

    创建自定义注解

    1. import java.lang.annotation.ElementType;
    2. import java.lang.annotation.Retention;
    3. import java.lang.annotation.RetentionPolicy;
    4. import java.lang.annotation.Target;
    5. @Target({ElementType.METHOD, ElementType.TYPE})
    6. @Retention(RetentionPolicy.RUNTIME)
    7. public @interface FileValidation {
    8. }

    拦截器

    1. @Override
    2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    3. if (handler instanceof HandlerMethod) {
    4. HandlerMethod handlerMethod = (HandlerMethod) handler;
    5. FileValidation fileValidation = handlerMethod.getMethodAnnotation(FileValidation.class);
    6. if (fileValidation != null) {
    7. if (request instanceof MultipartHttpServletRequest) {
    8. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    9. MultipartFile file = multipartRequest.getFile("file");
    10. List files = multipartRequest.getFiles("files");
    11. if (file != null) {
    12. if (file.isEmpty()) {
    13. throw new RuntimeException("Invalid file");
    14. }
    15. validateFile(file);
    16. } else if (files != null && !files.isEmpty()) {
    17. for (MultipartFile f : files) {
    18. if (f.isEmpty()) {
    19. throw new RuntimeException("Invalid file");
    20. }
    21. validateFile(f);
    22. }
    23. } else {
    24. throw new RuntimeException("No file or files attribute found in request");
    25. }
    26. }
    27. }
    28. }
    29. return true;
    30. }

    springboot注册拦截器

    1. import org.springframework.context.annotation.Configuration;
    2. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    3. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    4. @Configuration
    5. public class WebConfig implements WebMvcConfigurer {
    6. @Override
    7. public void addInterceptors(InterceptorRegistry registry) {
    8. registry.addInterceptor(new FileValidationInterceptor());
    9. }
    10. }

     controller使用方法

    1. @PostMapping("/uploadSingle")
    2. @FileValidation
    3. public ResponseEntity> uploadSingle(@Param("file") MultipartFile file) throws Exception{
    4. // ...
    5. }
    6. @PostMapping("/uploadMultiple")
    7. @FileValidation
    8. public ResponseEntity> uploadMultiple(@Param("files") MultipartFile[] files) throws Exception{
    9. // ...
    10. }

  • 相关阅读:
    工具篇 | 05 | IntelliJ IDEA
    2023华为杯数学建模研赛A题B题C题D题E题F题思路代码成品分享
    Shell编程条件语句(if、case)
    hive针对带有特殊字符非法json数据解析
    【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】
    Spring注解驱动之@Autowired、@Qualifier、@Primary
    清华美院「后羿雕塑」像外国人,引全网争议.....
    Zookeeper概述
    垃圾分类箱通过工业4G路由器实现无人值守远程管理
    CUDA用户对象
  • 原文地址:https://blog.csdn.net/lkh5201314/article/details/139259611