要实现了一个文件上传和验证的功能,具有以下特点:
1. 自定义注解:`FileValidation`注解用于标记需要进行文件验证的方法。
2. 文件验证拦截器:`FileValidationInterceptor`拦截器会在每个请求处理之前被调用。如果请求处理的方法上有`FileValidation`注解,那么拦截器会获取请求中的文件,并进行验证。
3. 文件验证:文件验证的逻辑在`FileValidationUtils`的`validateFile`方法中实现。这个方法会检查文件的MIME类型和文件扩展名是否匹配,以及文件的内容是否符合预期的文件格式。
4. 支持单个和多个文件上传:在`Controller`中,`upload`方法接受一个`MultipartFile`参数,表示上传的文件。在`FileValidationInterceptor`中,拦截器会检查请求中是否有名为"file"的参数,如果有,就获取这个参数并进行验证。同时,拦截器也支持多个文件上传,它会检查请求中是否有名为"files"的参数,如果有,就获取这个参数(一个文件列表),并对列表中的每个文件进行验证。
5. 错误处理:如果文件验证失败,`validateFile`方法会抛出一个异常。在`FileValidationInterceptor`中,如果捕获到这个异常,拦截器会停止请求的处理,并返回一个错误响应。
在Spring Boot中,拦截器和注解是常用的技术,用于实现各种复杂的功能。以下代码的设计和实现都遵循了Spring Boot的最佳实践。
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
-
- @Target({ElementType.METHOD, ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- public @interface FileValidation {
- }
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
- if (handler instanceof HandlerMethod) {
- HandlerMethod handlerMethod = (HandlerMethod) handler;
- FileValidation fileValidation = handlerMethod.getMethodAnnotation(FileValidation.class);
- if (fileValidation != null) {
- if (request instanceof MultipartHttpServletRequest) {
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- MultipartFile file = multipartRequest.getFile("file");
- List
files = multipartRequest.getFiles("files"); - if (file != null) {
- if (file.isEmpty()) {
- throw new RuntimeException("Invalid file");
- }
- validateFile(file);
- } else if (files != null && !files.isEmpty()) {
- for (MultipartFile f : files) {
- if (f.isEmpty()) {
- throw new RuntimeException("Invalid file");
- }
- validateFile(f);
- }
- } else {
- throw new RuntimeException("No file or files attribute found in request");
- }
- }
- }
- }
- return true;
- }
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new FileValidationInterceptor());
- }
- }
- @PostMapping("/uploadSingle")
- @FileValidation
- public ResponseEntity
> uploadSingle(@Param("file") MultipartFile file) throws Exception{ - // ...
- }
-
- @PostMapping("/uploadMultiple")
- @FileValidation
- public ResponseEntity
> uploadMultiple(@Param("files") MultipartFile[] files) throws Exception{ - // ...
- }