如何设置上传文件的最大大小

时间:2016-05-31 07:57:27

标签: tomcat file-upload spring-boot jhipster

我正在使用JHipster开发基于Spring Boot和AngularJS的应用程序。 我的问题是如何设置上传文件的最大尺寸

如果我尝试上传到大文件,我会在控制台中获取此信息:

  DEBUG 11768 --- [io-8080-exec-10] c.a.app.aop.logging.LoggingAspect: 

Enter: com.anuglarspring.app.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] = 

[org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: 

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]

状态为500的服务器响应。

如何设置?

17 个答案:

答案 0 :(得分:57)

同样在Spring boot 1.4中,您可以在application.properties中添加以下行来设置文件大小限制:

mBitmap = BitmapFactory.decodeResource(getResources(), getResourceID()).copy(Bitmap.Config.ARGB_8888, true);
mBitmap.setHasAlpha(true);

为我工作。资料来源:https://spring.io/guides/gs/uploading-files/

<强>更新

有人问了两个属性之间的差异。

以下是正式定义:

  

MaxFileSize:上传文件允许的最大大小(以字节为单位)。如果任何上载文件的大小大于此大小,则Web容器将引发异常(IllegalStateException)。默认大小是无限制的。

     

MaxRequestSize:multipart / form-data请求允许的最大大小,以字节为单位。如果所有上载文件的总大小超过此阈值,则Web容器将引发异常。默认大小是无限制的。

解释每一个:

MaxFileSize:上传单个文件的限制。这仅适用于单个文件限制。

MaxRequestSize:单个上传请求中所有文件总大小的限制。这将检查总限制。我们假设您有一个文件 a.txt b.txt ,用于单个上传请求。 a.txt 5kb b.txt 7kb 因此spring.http.multipart.max-file-size=128KB spring.http.multipart.max-request-size=128KB 应高于< EM> 12KB

答案 1 :(得分:17)

您需要将multipart.maxFileSizemultipart.maxRequestSize参数设置为高于默认值的值。这可以在spring boot配置yml文件中完成。例如,将以下内容添加到application.yml将允许用户上传10Mb文件:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

如果用户需要能够在单个请求中上传多个文件且总数超过10Mb,那么您需要将multipart.maxRequestSize配置为更高的值:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

来源:https://spring.io/guides/gs/uploading-files/

答案 2 :(得分:15)

在application.properties和application yaml中定义属性时有一些区别。

在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

答案 3 :(得分:15)

在Spring Boot 2中,spring.http.multipart更改为spring.servlet.multipart

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#multipart-configuration

答案 4 :(得分:13)

对于Spring Boot 2. +,请确保使用的是spring.servlet而不是spring.http

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

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

如果你可以在没有tomat的情况下生活,你可以replace tomcat with e.g. undertow并完全避免这个问题。

答案 5 :(得分:5)

更具体地说,在http: multipart: max-file-size: 512MB max-request-size: 512MB 配置文件中,将以下内容添加到“spring:”部分。

build.gradle

空白很重要,你cannot use tabs for indentation

答案 6 :(得分:4)

我在Expert Exchange找到了解决方案,对我来说效果很好。

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setMaxFileSize("124MB");
    factory.setMaxRequestSize("124MB");
    return factory.createMultipartConfig();
}

参考:https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html

答案 7 :(得分:4)

spring boot application.properties中的这些属性使可接受的文件大小不受限制-

# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1

答案 8 :(得分:4)

spring 2.x中。选项略有变化。因此,以上答案几乎是正确的,但并非完全正确。在您的application.properties文件中,添加以下内容-

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

答案 9 :(得分:2)

我知道游戏时间已经很晚了,但我想发布使用mysql时遇到的其他问题,如果有人将来面临同样的问题。

正如上面提到的一些答案,在application.properties中设置这些答案将主要解决问题

spring.http.multipart.max-file-size=16MB
spring.http.multipart.max-request-size=16MB

我将它设置为16 MB,因为我使用mysql MEDIUMBLOB数据类型来存储文件。

但是在修复application.properties后,上传文件时&gt; 4MB给出了错误: org.springframework.dao.TransientDataAccessResourceException:PreparedStatementCallback; SQL [插入test_doc(doc_id,duration_of_doc,doc_version_id,file_name,doc)值(?,?,?,?,?)];用于查询的分组太大(6656781> 4194304)。您可以通过设置max_allowed_pa​​cket'变量来更改服务器上的此值。嵌套异常是com.mysql.jdbc.PacketTooBigException:查询包太大(6656781&gt; 4194304)。您可以通过设置max_allowed_pa​​cket'变量来更改服务器上的此值。

所以我从mysql运行这个命令:

SET GLOBAL max_allowed_packet = 1024*1024*16;

答案 10 :(得分:2)

我正在使用spring-boot-1.3.5.RELEASE,但遇到了同样的问题。上述解决方案都不适合我。但是最终将以下属性添加到application.properties可以解决此问题。

multipart.max-file-size=10MB

答案 11 :(得分:1)

如果出现“连接重置”错误,则问题可能出在从Tomcat 7.0.55(ChangeLog

添加的Tomcat默认连接器 maxSwallowSize 属性中

来自Apache Tomcat 8 Configuration Reference

  

<强> maxSwallowSize :   请求正文字节的最大数量(不包括传输编码)   Tomcat将吞下的中断内容。一个   中止上传是Tomcat知道请求正文的时候   被忽略但客户端仍然发送它。如果Tomcat不吞咽   客户不太可能看到回应。如果没有指定   将使用默认值2097152(2兆字节)。值小于   超过零表示不应强制执行限制。

对于Springboot,嵌入式Tomcat声明了一个TomcatEmbeddedServletContainerFactory

Java 8:

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

Java 7:

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

或者在Tomcat / conf / server.xml中为5MB

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

答案 12 :(得分:1)

与 Askerali Maruthullathil 的 answer 一致,这对我有用(Spring Boot 与 Spring 5.2.2):

@Configuration
public class MultipartRequestFileConfig {

    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setResolveLazily(true);
        resolver.setMaxInMemorySize(83886080);
        resolver.setMaxUploadSize(83886080);
        return resolver;
    }
}

答案 13 :(得分:0)

上面的配置都不适合我使用Spring应用程序。

在主应用程序类(使用@SpringBootApplication注释的类)中实现此代码就可以了。

@Bean 
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
     return (ConfigurableEmbeddedServletContainer container) -> {

              if (container instanceof TomcatEmbeddedServletContainerFactory) {

                  TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                  tomcat.addConnectorCustomizers(
                          (connector) -> {
                              connector.setMaxPostSize(10000000);//10MB
                          }
                  );
              }
    };
}

您可以在声明中更改可接受的尺寸:

  

connector.setMaxPostSize(10000000); // 10MB

答案 14 :(得分:0)

为避免此异常,您可以像在Spring 1.5.8.RELEASE中一样使用VM参数帮助:

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb

答案 15 :(得分:0)

servlet:     多部分:       已启用:true       档案大小上限:900000000#900M       最大请求大小:900000000

答案 16 :(得分:0)

对我来说,以前的工作都没有(也许在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();
    }
}