在 Spring Boot 中增加 HTTP Post maxPostSize

Posted

技术标签:

【中文标题】在 Spring Boot 中增加 HTTP Post maxPostSize【英文标题】:Increase HTTP Post maxPostSize in Spring Boot 【发布时间】:2016-01-18 21:18:58 【问题描述】:

我有一个相当简单的 Spring Boot Web 应用程序,我有一个带有 enctype="multipart/form-data" 表单的 html 页面。我收到此错误:

多部分请求包含的参数数据(不包括上传的文件)超过了关联连接器上设置的 maxPostSize 限制。

我正在使用 Spring Boot 的默认嵌入式 tomcat 服务器。显然maxPostSize 的默认值是 2 兆字节。有没有办法编辑这个值?通过application.properties 这样做是最好的,而不必创建自定义bean 或弄乱xml 文件。

【问题讨论】:

无论您在哪里声明了多部分解析器,都可以更改这些内容。 我没有在任何地方声明它。我假设这意味着 spring boot 会自动创建和处理它。这是否意味着我无法编辑它? 您可以编辑它。找到多部分解析器并编辑值。如果有多部分支持,我相信你会找到一些配置。你甚至没有在主帖中发布你的配置,所以没有人能指出要改变什么。 【参考方案1】:

我确实面临着类似的问题。我在哪里 -

 "IllegalStateException multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector"

解决方案 我已经应用了以下属性,其中使用 ma​​x-http-form-post-size 属性确实对我产生了影响 -

server:
  tomcat:
    max-http-form-post-size: 100000000
    max-swallow-size: 100000000

随着-

spring:
  servlet:
    multipart:
      maxFileSize: 10MB
      maxRequestSize: 10MB

它对我有用。

【讨论】:

这看起来真的像以前遇到过问题的真实答案。谢谢@Loki GRADLE: server.tomcat.max-http-form-post-size=10000000 server.tomcat.max-swallow-size=10000000【参考方案2】:

Spring-boot 2.2.x 发生了变化

server.tomcat.max-http-post-size 

server.tomcat.max-http-form-post-size

spring-boot-issue

【讨论】:

你能添加一个文档链接吗,太棒了【参考方案3】:

在 Spring Boot >2 版本中,您可以简单地将以下内容添加到“application.properties”文件中:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB

【讨论】:

【参考方案4】:

这里的错误不是max-file-sizemax-request-size (as pointed out) 引起的,而是容器特定的 max-http-post-size 属性引起的。对于tomcat(默认容器),可以设置:

server.tomcat.max-http-post-size: 10MB

码头:

server.jetty.max-http-post-size: 10MB

暗流:

server.undertow.max-http-post-size: 10MB

这与 OP 的答案 here 具有相同的效果,但通过 application.properties 更可取。

【讨论】:

【参考方案5】:

为 Tomcat 和 servlet 应用设置

您可以在application.properties 中设置 Tomcat 的最大帖子大小,该大小设置为 int,如下所示。像其他一些答案一样,仅设置spring.servlet.multipart.max-request-size=10MB 可能还不够。

# Web properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

# Server properties
server.tomcat.max-http-post-size=100000000
server.tomcat.max-swallow-size=100000000

使用 Spring Boot 2.0.5.RELEASE

【讨论】:

[NOTE] 自 Spring Boot 版本 2.1.x 起,Tomcat 相关属性名称为 changed(添加了单词“form”)和现在是以下内容:server.tomcat.max-http-form-post-size。这在Spring Boot的Common Application properties官方列表中已经可以看到了。 我们也可以使用下面的可读格式。 # Server properties server.tomcat.max-http-post-size=10MB server.tomcat.max-swallow-size=10MB【参考方案6】:

application.properties 文件中写下:

# Max file size.
spring.http.multipart.max-file-size=1Mb
# Max request size.
spring.http.multipart.max-request-size=10Mb

根据需要调整大小。


更新

注意:Spring Boot 2 开始,您现在可以这样做

# Max file size.
spring.servlet.multipart.max-file-size=1MB
# Max request size.
spring.servlet.multipart.max-request-size=10MB

Appendix A. Common application properties - Spring

【讨论】:

试过了,仍然给我错误。我实际上并没有在表单中上传任何文件,我只是有很多输入字段,其值长达数万个字符,如果我有太多文本(超过 2MB 的文本)它会崩溃。希望将 postMaxSize 增加到 2MB 以上以避免这个问题。 属性名称中不应包含破折号。 multipart.maxRequestSize=20MB multipart.maxFileSize=20MB spring.http.multipart.max-file-size=1Mb # Max file size. Values can use the suffixed "MB" or "KB" to indicate a Megabyte or Kilobyte size. spring.http.multipart.max-request-size=10Mb # Max request size. Values can use the suffixed "MB" or "KB" to indicate a Megabyte or Kilobyte size. 现已弃用 :( 编辑:没关系,找到解决方案 - 编辑这篇文章。 对我来说,在春季版2.0.0.RELEASE 旧的(和被贬低的)属性根本不起作用。所以你必须使用新的。【参考方案7】:

对我来说,这在 yaml 中有效

spring:
    profiles: ....
    application:
        name:"...."
    http:
        multipart:
            max-file-size: 2147483648
            max-request-size: 2147483648

【讨论】:

【参考方案8】:

这对我来说适用于 Tomcat 8

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("Catalina:type=Connector,port=" + 8080);
mbeanServer.setAttribute(objectName, new Attribute("maxPostSize", 100000000));

【讨论】:

【参考方案9】:

对我来说没有任何以前的作品(也许在这里使用带有 yaml 的应用程序是一个问题),但是使用它来解决这个问题:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@ServletComponentScan
@SpringBootApplication
public class App 
    public static void main(String[] args) 
        SpringApplication.run(App.class, args);
    

    @Bean
    MultipartConfigElement multipartConfigElement() 
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofBytes(512000000L));
        factory.setMaxRequestSize(DataSize.ofBytes(512000000L));
        return factory.createMultipartConfig();
    

【讨论】:

【参考方案10】:

没有一个解决方案对我有用,而且它们中的大多数都是完全题外话,因为 OP 谈论的是 ma​​xPostSize,而不是 ma​​xFileSize(后者给你一个不同的错误无论如何,如果超过大小)

解决方案:在 /tomcat/conf/server.xml 中添加 maxPostSize="" 属性到连接器

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxPostSize="10485760"
           redirectPort="8443" />

【讨论】:

【参考方案11】:

如果您在 POST 请求中使用 x-www-form-urlencoded 媒体类型(就像我一样),spring-boot 的 multipart 属性不起作用。如果您的 spring-boot 应用程序也在启动一个 tomcat,您需要在 application.properties 文件中设置以下属性:

# Setting max size of post requests to 6MB (default: 2MB)
server.tomcat.max-http-post-size=6291456

我在 spring-boot 文档中的任何地方都找不到该信息。希望它对也坚持使用 x-www-form-urlencoded 正文编码的任何人有所帮助。

【讨论】:

看起来对于多部分请求也是如此。我将 Spring Boot 2.0.4.RELEASE 与 Tomcat Embed 8.5.32 一起使用。我有与问题相同的错误消息,在 org.apache.catalina.connector.Request 中引发异常,因为以下检查成功:“if (postSize > maxPostSize) ... "。而这个内部 maxPostSize 字段只能通过“server.tomcat.max-http-post-size”属性进行更改。 @StanislavMamontov 我使用 Spring Boot 2.0.3.RELEASE,对我来说,“spring.servlet.multipart”属性适用于多部分,但对于 x-www-form-urlencoded,我必须使用“ server.tomcat.max-http-post-size" 属性。 感谢您的提示 - 此处也列出了该属性docs.spring.io/spring-boot/docs/current/reference/html/…,现在称为 server.tomcat.max-http-form-post-size【参考方案12】:

当我们在application.yamlapplication.properties中定义属性时会有一些不同。

application.yml:

spring:
  http:
    multipart:
      max-file-size: 256KB
      max-request-size: 256KB

application.propeties:

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

注意:Spring 版本 4.3 和 Spring boot 1.4

【讨论】:

【参考方案13】:

首先,确保您使用的是spring.servlet 而不是spring.http

---
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

如果你必须使用 tomcat,你最终可能会创建 EmbeddedServletContainerCustomizer,这并不是什么好事。

如果你可以不吃番茄,你可以replace tomcat with e.g. undertow 并完全避免这个问题。

【讨论】:

Undertow 也有同样的问题,所以切换并不能避免这个问题。此答案中的配置适用于最新版本的 Spring-Boot v1.5.9 中的 Undertow【参考方案14】:

来自文档:https://spring.io/guides/gs/uploading-files/

调整文件上传限制

在配置文件上传时,设置限制通常很有用 文件的大小。想象一下尝试处理 5GB 文件上传!带弹簧 启动后,我们可以调整其自动配置的 MultipartConfigElement 一些 属性设置。

将以下属性添加到您现有的 src/main/resources/application.properties:

spring.http.multipart.max-file-size=128KB

spring.http.multipart.max-request-size=128KB

多部分设置约束如下:

spring.http.multipart.max-file-size is set to 128KB,表示总计 文件大小不能超过 128KB。

spring.http.multipart.max-request-size 设置为 128KB,这意味着 multipart/form-data 的总请求大小 不能超过 128KB。

【讨论】:

【参考方案15】:

找到了解决办法。将此代码添加到运行 SpringApplication.run 的同一类中。

// Set maxPostSize of embedded tomcat server to 10 megabytes (default is 2 MB, not large enough to support file uploads > 1.5 MB)
@Bean
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception 
    return (ConfigurableEmbeddedServletContainer container) -> 
        if (container instanceof TomcatEmbeddedServletContainerFactory) 
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(
                (connector) -> 
                    connector.setMaxPostSize(10000000); // 10 MB
                
            );
        
    ;

编辑:显然将其添加到您的 application.properties 文件中也会增加 maxPostSize,但我自己没有尝试过,所以无法确认。

multipart.maxFileSize=10Mb # Max file size.
multipart.maxRequestSize=10Mb # Max request size.

【讨论】:

添加属性对我有用:multipart.maxFileSize 和 multipart.maxRequestSize connector 解决方案对我不起作用,multipart.maxFileSize 也不起作用。对我有用的是下面的答案中的spring.http.multipart.max-file-size 如果您需要 POST (ou PUT) 具有更多 2 MB 的有效负载请求(不是文件上传),此解决方案是完美的。发布一个 9 MB 的请求(某些表单字段带有一些 Base64 编码的文件作为字符串)很好。

以上是关于在 Spring Boot 中增加 HTTP Post maxPostSize的主要内容,如果未能解决你的问题,请参考以下文章

第二章 第二个spring-boot程序

在 Apache SSL 代理后面嵌入 Tomcat 的 Spring Boot

以编程方式增加 Spring Boot 中的线程数

如何在 Spring Boot 中自动增加 mongo db?

Spring Boot 中文乱码解决

Spring boot maven插件:包含测试资源