1. 自定义文件验证注解
首先在spring boot中定义一个注解,用于标记需要校验的文件字段。这个注解包含验证所需的参数:允许的扩展名、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):自定义的约束器实现
2. 实现约束验证器
接下来,创建一个类来实现constraintvalidator接口,具体实现文件的扩展名、类型、大小的校验逻辑。
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中使用这个注解来校验文件。
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响应。
- 以上注解合并了三个验证逻辑, 会导致验证失败是提示语不具体, 如有改需求,可以将其拆分成为三个注解.
到此这篇关于springboot实现自定义注解用于文件验证的详细过程(大小、扩展名、mime类型)的文章就介绍到这了,更多相关springboot自定义注解文件验证内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论