SpringBoot實現(xiàn)自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)
1. 自定義文件驗證注解
首先在Spring Boot中定義一個注解,用于標(biāo)記需要校驗的文件字段。這個注解包含驗證所需的參數(shù):允許的擴展名、MIME類型和最大文件大小。
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):自定義的約束器實現(xiàn)
2. 實現(xiàn)約束驗證器
接下來,創(chuàng)建一個類來實現(xiàn)ConstraintValidator接口,具體實現(xiàn)文件的擴展名、類型、大小的校驗邏輯。
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,實際是通過文件頭內(nèi)容中的魔法數(shù)來驗證的
var detect = tika.detect(TikaInputStream.get(file.getInputStream()));
return mimeTypes.contains(detect);
}
}
注: apache tika 是一個開源的文檔識別工具,它可以自動檢測文件類型并提取文件內(nèi)容。使用 Tika,可以方便地確定文件類型和拓展名,從而根據(jù)文件類型來執(zhí)行相應(yīng)的操作,具體使用不是本文內(nèi)容不再介紹了.
3. 使用注解
最后在Spring Boot的Controller中使用這個注解來校驗文件。
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響應(yīng)。
- 以上注解合并了三個驗證邏輯, 會導(dǎo)致驗證失敗是提示語不具體, 如有改需求,可以將其拆分成為三個注解.
到此這篇關(guān)于SpringBoot實現(xiàn)自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)的文章就介紹到這了,更多相關(guān)SpringBoot自定義注解文件驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body
這篇文章主要介紹了Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java中Integer.valueOf,parsetInt() String.valueOf的區(qū)別和結(jié)果代碼解析
本文通過代碼給大家講解了JAVA中Integer.valueOf, parsetInt() String.valueOf的區(qū)別和結(jié)果,需要的朋友可以參考下2018-05-05
mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問題
這篇文章主要介紹了mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

