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);
}
}
