programing

Spring Boot에서 HTTP Post maxPostSize 증가

css3 2023. 8. 8. 21:45

Spring Boot에서 HTTP Post maxPostSize 증가

나는 꽤 간단한 스프링 부트 웹 애플리케이션을 가지고 있고, 나는 양식이 있는 단일 HTML 페이지를 가지고 있습니다.enctype="multipart/form-data"다음 오류가 발생합니다.

다중 부품 요청에 관련 커넥터에 설정된 maxPostSize 제한을 초과하는 매개 변수 데이터(업로드된 파일 제외)가 포함되었습니다.

Spring Boot의 기본 내장 Tomcat 서버를 사용하고 있습니다.분명히 기본값입니다.maxPostSize값은 2MB입니다.이 값을 편집할 수 있는 방법이 있습니까?을 통해 수행application.properties커스터마이징된 빈을 만들거나 xml 파일을 엉망으로 만드는 것보다 더 좋을 것입니다.

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

부록 A.공통 응용 프로그램 속성 - 스프링

POST 요청에서 x-www-form-url 인코딩 미디어 유형을 사용하는 경우(나와 마찬가지로) 스프링 부트의 다중 부분 속성이 작동하지 않습니다.스프링 부트 응용 프로그램도 Tomcat을 시작하는 경우 application.properties 파일에서 다음 속성을 설정해야 합니다.

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

스프링 부트 문서에서 해당 정보를 찾을 수 없었습니다.신체의 x-www-형식-url-encoded 인코딩을 고수하는 모든 사람에게 도움이 되기를 바랍니다.

해결책을 찾았습니다.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.

Tomcat 및 서블릿에 대한 설정 적용

Tomcat의 최대 게시 크기를 설정할 수 있습니다.application.properties아래와 같이 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 Boot2.0.5.RELEASE

먼저, 사용 중인지 확인합니다.spring.servlet대신에spring.http.

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

Tomcat을 사용해야 하는 경우 Embedded ServletContainerCustomizer를 생성할 수 있습니다. 이 작업은 그다지 좋지 않습니다.

만약 당신이 토마토 없이 살 수 있다면, 당신은 tomcat을 아래와 같은으로 대체하고 이 문제를 전혀 피할 수 있습니다.

여기서의 오류는 다음에 의해 발생하지 않습니다.max-file-size또는max-request-size( 지적된 바와 같이) 오히려 컨테이너별 최대 크기-후 크기 속성입니다.Tomcat(기본 컨테이너)의 경우 다음을 설정할 수 있습니다.

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

제티:

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

언더로우:

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

이것은 여기서 OP의 답변과 동일한 효과를 가지지만, 훨씬 더 선호되는 application.properties를 통해 이루어집니다.

어떤 솔루션도 나에게 효과가 없었고 OP가 maxFileSize가 아니라 maxPostSize에 대해 이야기하고 있기 때문에 대부분의 솔루션은 주제에서 완전히 벗어났습니다(나중에 크기가 초과되면 어쨌든 다른 오류가 발생합니다).

솔루션: /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" />

Spring-boot 2.2.x가 변경되었습니다.

server.tomcat.max-http-post-size 

로.

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

봄부츠 발행

설명서에서: https://spring.io/guides/gs/uploading-files/

파일 업로드 제한 조정 중

파일 업로드를 구성할 때 파일 크기를 제한하는 것이 유용한 경우가 많습니다.5GB 파일 업로드를 처리하려고 한다고 상상해 보십시오!Spring Boot를 사용하면 자동으로 구성된 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를과 할수니다습없초▁meaning다.

  • spring.http.multipart.max-request-size는 128KB로 설정되어 있습니다. 즉, 다중 부품/폼 데이터의 총 요청 크기는 128KB를 초과할 수 없습니다.

저에게 이전 작업은 아무것도 없습니다(아마도 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();
    }
}

저도 비슷한 문제에 직면해 있었습니다.내가 받은 오류는 -입니다.

 "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

위의 구성이 제대로 작동했습니다.

다음에서 속성을 정의할 때 약간의 차이가 있습니다.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 부트 1.4

Spring Boot > 2 버전에서는 "application.properties" 파일에 다음을 추가하기만 하면 됩니다.

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

여기에 언급된 모든 속성과 솔루션을 사용해 보았습니다.SpringBoot 2.7.0을 실행할 때 2하는 것은 ../gradlew bootRun.

결국 사용자 정의 필터를 추가하게 되었습니다.

public class Application
{
   private static final int DEFAULT_LIMIT = 10 * 1024 * 1024;

   public static void main(String[] args)
   {
      SpringApplication.run(Application.class, args);
   }

   @Bean
   public FilterRegistrationBean<RequestBodyLimitFilter> createRequestBodyLimitFilter(
         @Value("${PAYLOAD_LIMIT:" + DEFAULT_LIMIT + "}") Integer limitBytes)
   {
      FilterRegistrationBean<RequestBodyLimitFilter> registration = new FilterRegistrationBean<>();
      registration.setFilter(new RequestBodyLimitFilter(limitBytes));
      registration.setName("RequestBodyLimitFilter");
      return registration;
   }
}

그리고.RequestBodyLimitFilter:

public class RequestBodyLimitFilter implements Filter
{
   private static Logger LOG = Logger.getLogger(RequestBodyLimitFilter.class.getName());
   private final Integer limitBytes;

   public RequestBodyLimitFilter(Integer limitBytes)
   {
      this.limitBytes = limitBytes;
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
   {
      long contentLengthLong = request.getContentLengthLong();
      if (contentLengthLong > limitBytes)
      {
         LOG.info("Received " + contentLengthLong + " limit is " + limitBytes);
         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
         httpServletResponse.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
         return;
      }
      chain.doFilter(request, response);
   }
}
```

에서 첫 2에, 은 이은 Google 첫번의째과것 2.7.x및그이한정전가답을답진없이다것니입때추는되가이것에이기문한후완에대고결에 추가된 입니다.application.properties나를 위해 그것을 고쳤습니다.

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

# Tomcat properties
server.tomcat.max-http-form-post-size=10MB
server.tomcat.max-swallow-size=10MB

나에게 이것은 yaml에서 작동했습니다.

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

이것은 Tomcat 8과 함께 저에게 효과가 있었습니다.

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

언급URL : https://stackoverflow.com/questions/33232849/increase-http-post-maxpostsize-in-spring-boot