SpringBoot 实现文件上传

1 创建文件上传表单

<form method="POST" enctype="multipart/form-data" action="/upload">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>

SizeLimitExceededException和MaxUploadSizeExceededException都是文件上传时可能抛出的异常,它们的区别如下:

  • SizeLimitExceededException是Apache Commons FileUpload库提供的异常,用于表示上传的文件大小超过了指定的文件大小限制,或者上传的所有文件大小的总和超过了指定的限制。这个异常的触发条件是,上传的文件大小或总和大小超过了限制,因此它是一种比较粗略的文件大小限制。SizeLimitExceededException异常通常是由Servlet容器(如Tomcat)抛出的。
  • MaxUploadSizeExceededException是Spring框架提供的异常,用于表示上传的文件大小超过了Spring应用程序配置的最大文件大小。这个异常的触发条件是,上传的文件大小超过了Spring应用程序配置的最大文件大小,因此它是一种更细致的文件大小限制。MaxUploadSizeExceededException异常通常是由Spring框架的文件上传组件抛出的。

因此,MaxUploadSizeExceededException更适合用于在Spring应用程序中进行文件大小限制,而SizeLimitExceededException更适合用于在Servlet容器中进行文件大小限制。在实际开发中,如果使用Spring框架提供的文件上传组件,则应该使用MaxUploadSizeExceededException异常进行文件大小限制。如果使用Servlet容器提供的文件上传组件,则可以使用SizeLimitExceededException异常进行文件大小限制。

2 创建Controller

@RestController
@RequestMapping("file")
@Slf4j
public class FileController {
    @Value("${file.upload.url:/root/}")
    private String uploadFilePath;

    @RequestMapping("/upload")
    public Object upload(MultipartFile file) throws Exception{
        file.transferTo(new File(uploadFilePath+file.getOriginalFilename()));
        return ApiUtils.success("文件上传成功");
    }

}

3 配置文件上传限制

file.upload.url=/Users/xiongmc/Downloads/demo/logs/
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=12MB

添加异常捕获

@ControllerAdvice
public class FileUploadExceptionHandler {

    @ExceptionHandler(SizeLimitExceededException.class)
    public ResponseEntity<Object>  handleSizeLimitExceededException(SizeLimitExceededException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body("超出大小限制异常");
    }
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<Object> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body("超过最大上传大小异常");
    }
}

要将此异常处理程序添加到Spring Boot应用程序中,请确保将其放置在扫描路径下,并将其注册为Spring组件。例如,在使用Spring Boot自动配置的情况下,可以在应用程序主类上添加@ComponentScan注解,以确保该组件被扫描和注册。

@SpringBootApplication
@ComponentScan(basePackages = "com.example.demo.exception")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}