在 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"
解决方案 我已经应用了以下属性,其中使用 max-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-size
或 max-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=20MBspring.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 谈论的是 maxPostSize,而不是 maxFileSize(后者给你一个不同的错误无论如何,如果超过大小)
解决方案:在 /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.yaml
和application.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.maxRequestSizeconnector
解决方案对我不起作用,multipart.maxFileSize
也不起作用。对我有用的是下面的答案中的spring.http.multipart.max-file-size
。
如果您需要 POST (ou PUT) 具有更多 2 MB 的有效负载请求(不是文件上传),此解决方案是完美的。发布一个 9 MB 的请求(某些表单字段带有一些 Base64 编码的文件作为字符串)很好。以上是关于在 Spring Boot 中增加 HTTP Post maxPostSize的主要内容,如果未能解决你的问题,请参考以下文章
在 Apache SSL 代理后面嵌入 Tomcat 的 Spring Boot