** ❃博主首页 :**
「码到三十五」
,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 :
<源码解读>
<面试攻关>
♝博主的话 :搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基
SpringBoot,Spring Cloud中经常需要处理文件上传的功能。为了确保上传的文件满足特定的要求(如扩展名、MIME类型和文件大小),我们可以创建一个自定义注解来简化验证过程。
文章目录
1. 自定义文件验证注解
首先在Spring Boot中定义一个注解,用于标记需要校验的文件字段。这个注解包含验证所需的参数:允许的扩展名、MIME类型和最大文件大小。
importjavax.validation.Constraint;importjavax.validation.Payload;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Documented@Constraint(validatedBy =FileValidator.class)@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public@interfaceValidFile{Stringmessage()default"{constraints.ValidFileMimeType.message}";Class<?>[]groups()default{};Class<?extendsPayload>[]payload()default{};String[]extensions()default{};String[]mimeTypes()default{};longmaxSize()default1024*1024;// 默认最大1MB}
注释的组成部分:
maxSize: 文件大小限制,默认1M
mimeTypes:MIME类型
extensions:允许的扩展名
message():验证失败时的默认错误消息
constraint(validatedBy = FileValidator.class):自定义的约束器实现
2. 实现约束验证器
接下来,创建一个类来实现
ConstraintValidator
接口,具体实现文件的扩展名、类型、大小的校验逻辑。
importorg.springframework.web.multipart.MultipartFile;importjavax.validation.ConstraintValidator;importjavax.validation.ConstraintValidatorContext;importjava.io.IOException;publicclassFileValidatorimplementsConstraintValidator<ValidFile,MultipartFile>{privatefinalTika tika =newTika();privateList<String> extensions;privateList<String> mimeTypes;privatelong maxSize;@Overridepublicvoidinitialize(ValidFile constraintAnnotation){
extensions =List.of(constraintAnnotation.extensions());
mimeTypes =List.of(constraintAnnotation.mimeTypes());
maxSize = constraintAnnotation.maxSize();}@OverridepublicbooleanisValid(MultipartFile file,ConstraintValidatorContext context){if(file ==null|| file.isEmpty()){returntrue;}// 文件大小验证if(file.getSize()> maxSize){returnfalse;}// 文件扩展名验证// 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中使用这个注解来校验文件。
importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjavax.validation.constraints.NotNull;@RestControllerpublicclassFileUploadController{@PostMapping("/upload")publicResponseEntity<?>uploadFile(@RequestParam("file")@NotNull@ValidFile(extensions ={"jpg","png"}, mimeTypes ={"image/jpeg","image/png"}, maxSize =2*1024*1024)MultipartFile file){// 文件处理逻辑returnResponseEntity.ok("File uploaded successfully");}}
@ValidFile
注解验证文件的扩展名是否为"jpg"或"png",MIME类型是否为"image/jpeg"或"image/png",以及文件大小是否不超过2MB。如果文件不符合这些要求,SpringBoot将自动返回400 Bad Request响应。
- 以上注解合并了三个验证逻辑, 会导致验证失败是提示语不具体, 如有改需求,可以将其拆分成为三个注解.
关注公众号[码到三十五]获取更多技术干货 !
版权归原作者 码到三十五 所有, 如有侵权,请联系我们删除。