Spring Boot 处理 SizeLimitExceededException

2024-03-10

我使用 Spring boot 1.5.7。
我还没有配置 CommonsMultipartResolver,因为 Spring Boot 已经处理文件上传了。

如果我的上传超过允许的最大大小,则会抛出一个丑陋的异常。
这是由我的控制器处理的。

@ControllerAdvice
public abstract class DefaultController implements InitializingBean {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ServiceException> handleException(final Exception ex) {
        ...
        } else if (ex instanceof MultipartException) {
            MultipartException me = (MultipartException) ex;
            Throwable cause = ex.getCause();
            if (cause instanceof IllegalStateException) {
                Throwable cause2 = cause.getCause();
                if (cause2 instanceof SizeLimitExceededException) {
                    // this is tomcat specific
                    SizeLimitExceededException slee = (SizeLimitExceededException) cause2;
                }
            }
        }

这种处理不仅复杂,而且遗憾的是 Tomcat 特有的,因为 SizeLimitExceededException 位于包中org.apache.tomcat.util.http.fileupload.FileUploadBase.

我该如何处理错误情况,即有人上传了一个更大的文件,然后允许并返回一条不错的消息,无论使用哪个 Servlet 引擎?


您可以在您的中定义异常处理程序方法@ControllerAdvice这是专门针对MultipartException然后用特定的条件限定它HttpStatus。例如:

@ExceptionHandler(MultipartException.class)
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE)
public ResponseEntity<ServiceException> handleMultipartException(MultipartException ex) {
    ...
}

这应该允许您专注于“最大文件大小”异常,而不必了解 servlet 容器的具体细节。

Update 1回应此评论:

听起来不错,那么 SizeLimitExceededException 提供的 getPermissionSize 和 getActualSize 怎么样,不仅使用 Tomcat 才有机会获取这个值吗?

通过根据 (a) 异常类型和 (b) HTTP 状态拦截此错误......您可以使解决方案普遍适用。但这样做时,您可能会丢失某个 servlet 容器(但可能不是另一个容器)可能为您提供的详细信息。您也许可以通过设置来强制执行自己的最大大小spring.http.multipart.max-file-size在这种情况下,您可以报告“允许的大小”,但如果您想报告“实际大小”,则必须考虑以下其中一项:

  • 必须使用servlet容器提供的东西
  • 选择一个spring.http.multipart.max-file-size它小于 servlet 容器支持的最大值,然后在控制器内应用您自己的最大大小检查,并抛出您自己的包含实际大小和允许大小的特定异常类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 处理 SizeLimitExceededException 的相关文章

随机推荐