前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot中实现自定义注解用于文件验证(大小、扩展名、MIME类型)

SpringBoot中实现自定义注解用于文件验证(大小、扩展名、MIME类型)

作者头像
公众号:码到三十五
发布2024-09-05 10:37:22
1160
发布2024-09-05 10:37:22
举报
文章被收录于专栏:设计模式

1. 自定义文件验证注解

首先在Spring Boot中定义一个注解,用于标记需要校验的文件字段。这个注解包含验证所需的参数:允许的扩展名、MIME类型和最大文件大小。

代码语言:javascript
复制
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Constraint(validatedBy = FileValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidFile {
    String message() default "{constraints.ValidFileMimeType.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    String[] extensions() default {};
    String[] mimeTypes() default {};
    long maxSize() default 1024 * 1024; // 默认最大1MB
}

注释的组成部分: maxSize: 文件大小限制,默认1M mimeTypes:MIME类型 extensions:允许的扩展名 message():验证失败时的默认错误消息 constraint(validatedBy = FileValidator.class):自定义的约束器实现

2. 实现约束验证器

接下来,创建一个类来实现ConstraintValidator接口,具体实现文件的扩展名、类型、大小的校验逻辑。

代码语言:javascript
复制
import org.springframework.web.multipart.MultipartFile;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.IOException;

public class FileValidator implements ConstraintValidator<ValidFile, MultipartFile> {
    private final Tika tika = new Tika();
    private List<String> extensions;
    private List<String> mimeTypes;
    private long maxSize;

    @Override
    public void initialize(ValidFile constraintAnnotation) {
        extensions = List.of(constraintAnnotation.extensions());
        mimeTypes = List.of(constraintAnnotation.mimeTypes());
        maxSize = constraintAnnotation.maxSize();
    }

    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {
        if (file == null || file.isEmpty()) {
            return true;
        }
        // 文件大小验证
        if (file.getSize() > maxSize) {
            return false;
        }
        // 文件扩展名验证
        // String fileName = file.getOriginalFilename();
        // String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
        String fileExtension = FilenameUtils.getExtension(file.getOriginalFilename());
        if( StringUtils.isNotBlank(fileExtension) && extensions.contains(fileExtension .toLowerCase())){
            retrun true;
        }
        // 这里使用apache tika验证文件mime,实际是通过文件头内容中的魔法数来验证的
        var detect = tika.detect(TikaInputStream.get(file.getInputStream()));
        return mimeTypes.contains(detect);
    }
}

注: apache tika 是一个开源的文档识别工具,它可以自动检测文件类型并提取文件内容。使用 Tika,可以方便地确定文件类型和拓展名,从而根据文件类型来执行相应的操作,具体使用不是本文内容不再介绍了.

3. 使用注解

最后在Spring Boot的Controller中使用这个注解来校验文件。

代码语言:javascript
复制
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public ResponseEntity<?> uploadFile(@RequestParam("file") @NotNull @ValidFile(extensions = {"jpg", "png"}, mimeTypes = {"image/jpeg", "image/png"}, maxSize = 2 * 1024 * 1024) MultipartFile file) {
        // 文件处理逻辑
        return ResponseEntity.ok("File uploaded successfully");
    }
}

@ValidFile注解验证文件的扩展名是否为"jpg"或"png",MIME类型是否为"image/jpeg"或"image/png",以及文件大小是否不超过2MB。如果文件不符合这些要求,SpringBoot将自动返回400 Bad Request响应。

  • 以上注解合并了三个验证逻辑, 会导致验证失败是提示语不具体, 如有改需求,可以将其拆分成为三个注解.

关注公众号[码到三十五]获取更多技术干货 !

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 实现约束验证器
  • 3. 使用注解
相关产品与服务
行业文档识别
行业文档识别(Document Optical Character Recognition,Document OCR)基于行业前沿的深度学习技术,支持将图片上的文字内容,智能识别为结构化的文本,可应用于智能核保、智能理赔、试题批改等多种行业场景,大幅提升信息处理效率。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档