上传文件的大小超出限制后,只能看到下面的异常,浏览器什么也不显示:
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded
使用 @ExceptionHandler 可以捕获异常,但是没什么用,返回的视图或者文字信息还是显示不出来,看log是被默认的 HandlerExceptionResolver 给截获了,那就好办了,使用自定义的 HandlerExceptionResolver
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
public class MyHandlerExceptionResolver extends ExceptionHandlerExceptionResolver {
@Override
protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
ModelAndView mav = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
if(exception instanceof MaxUploadSizeExceededException) {
// throw new MaxUploadSizeExceededException(((MaxUploadSizeExceededException) exception).getMaxUploadSize());
if(mav == null) {
mav = new ModelAndView();
}
mav.setStatus(HttpStatus.PAYLOAD_TOO_LARGE);
mav.setViewName("upload_failed");
}
return mav;
}
}
应用自定义的 HandlerExceptionResolver
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public HandlerExceptionResolver myHandlerExceptionResolver() {
return new MyHandlerExceptionResolver();
}
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(myHandlerExceptionResolver());
}
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
for (HandlerExceptionResolver resolver : resolvers) {
System.out.println("WebConfig # extendHandlerExceptionResolvers() - " + resolver);
}
}
}
HTML视图模版 upload_failed.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>上传失败</h1>
</body>
</html>
再次上传大文件测试,浏览器可以显示自定义的HTML了!
当然,也可以在前端使用JS进行判断:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function fileSelected() {
var file = document.getElementById('fileUpload').files[0];
if (file) {
var fileSize = file.size;
var maxSize = 1024 * 1024; // 1MB
if (fileSize > maxSize) {
alert('File size exceeds maximum allowed size of 1MB.');
return false;
}
return true;
}
alert('请选择要上传的文件');
return false;
}
</script>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data" onsubmit="return fileSelected()">
<label for="fileUpload">选择文件:</label>
<input type="file" id="fileUpload" value="未选择文件" name="multipartFile">
<input type="submit" value="上传">
</form>
</body>
</html>