java - Spring Boot application.properties上传文件异常

标签 java spring-mvc exception spring-boot

我在Springboot application.properties中写了一些代码:

spring.http.multipart.max-file-size=1024KB
spring.http.multipart.max-request-size=1024KB

当上传的文件大于设置值时出现异常:

org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException:the request was rejected because.......

我想捕获这个异常并显示自定义格式,我该怎么办?

最佳答案

要捕获与 MultipartException 相关的异常以及类似的其他异常,更好的方法是创建一个全局异常 Controller 。该 Controller 将能够捕获给定的异常并向客户端返回一条人性化的错误消息。

@ControllerAdvice
public class ExceptionController {

    NumberFormat numberFormatter = new DecimalFormat("#0.00");

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<?> handleException(Exception e) { 
        if(e instanceof MultipartException){
            String message = "Invalid form data";
            if(e.getCause() instanceof IllegalStateException){
                if(((MultipartException) e).getRootCause() instanceof SizeException){
                    SizeException sizeException = (SizeException) ((MultipartException) e).getRootCause();
                    if(sizeException instanceof FileSizeLimitExceededException){
                        FileSizeLimitExceededException cause = (FileSizeLimitExceededException) sizeException;
                        message  = "File Size should be less than: " + numberFormatter.format(cause.getPermittedSize()/Math.pow(2F, 20)) + "MB";
                    }
                    else if(sizeException instanceof SizeLimitExceededException){
                        SizeLimitExceededException cause = (SizeLimitExceededException) sizeException;
                        message  = "Request Size should be less than: " + numberFormatter.format(cause.getPermittedSize()/Math.pow(2F, 20)) + "MB";
                    }
                }
            }
            return new ResponseEntity<YourCustomResponseObject>(new 
            YourCustomResponseObject(message), 
            HttpStatus.ANY_ERROR_CODE_YOU_WANT);
             }
        }
}

以上示例将帮助您使用自定义消息捕获与最大文件大小和最大请求​​大小异常相关的异常。

已更新

如果您使用的文件非常大,那么您的浏览器可能会变得无响应。在这种情况下,如果您使用的是嵌入式 tomcat,请在配置文件中添加以下行

@Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                //-1 means unlimited
                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        });
        return tomcat;
    }

但是,如果您使用的是独立的 tomcat,则更改 server.xml 文件中的 maxSwallowSize 属性

<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" 
    maxSwallowSize="-1"/>

-1 表示请求的最大大小

关于java - Spring Boot application.properties上传文件异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45345839/

相关文章:

java - 是否有用于 java 自动导入的 VS-code 扩展?

简单字符串中的 Java,Spring 国际化 : how to use values from . 属性?

c# - 如何在单元测试中模拟抛出异常?

java - AsynkTask 后方法不更新 UI

java - 将变量传递给 Java (android) 中的嵌套方法并返回它

java - 来自 HashSet 的并行流不会并行运行

java - Spring - 无法加载资源(CSS)

java - jdbctemplate,jpatemplate

java - 异常 + 迭代器结束信号 : why is it bad in Java and normal in Python?

java - 简单的Java程序在抛出异常时中断