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

我正在使用 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的服务器响应。

怎么设置?

187322 次浏览

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

multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb

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

multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb

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

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

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

弹簧启动 2. x及以上

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

对我有用,来源: https://spring.io/guides/gs/uploading-files/

更新:

有人问这两处房产有什么不同。

以下是正式定义:

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

MaxRequestSize: 多部分/表单数据请求允许的最大大小(以字节为单位)。如果所有上传文件的总体大小超过这个阈值,Web 容器将引发异常。默认大小是无限的。

分别解释:

MaxFileSize: 上载单个文件的限制。这只适用于单个文件限制。

MaxRequestSize: 单个上载请求中所有文件的总大小限制.这个检查总限额。假设有两个文件 短信B.txt用于单个上传请求。短信5kbB.txt7kb,所以 MaxRequestSize应该高于 12kb

更具体地说,在 application.yml配置文件中,将以下内容添加到“ spring:”部分。

http:
multipart:
max-file-size: 512MB
max-request-size: 512MB

空格很重要,你 不能使用制表符进行缩进

在 application.properties 和 application yaml 中定义属性时会有一些不同。

在应用中:

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

用途:

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

注意: Spring 版本4.3和 Spring 启动1.4

如果出现“ connect resets”错误,问题可能出现在 Tomcat 7.0.55(更改日志)中添加的 Tomcat 缺省连接器 MaxSwallowSize属性中

来自 ApacheTomcat 8配置参考

MaxSwallowSize : 请求体字节的最大数目(不包括传输编码) 将被 Tomcat 吞噬以进行中止的上传 当 Tomcat 知道请求体将要 被忽略,但客户端仍然发送它。如果 Tomcat 不吞下 客户端不太可能看到响应。如果没有指定 将使用默认值2097152(2MB)。值小于 指示不应强制执行任何限制。

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

爪哇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;
}

爪哇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 中获取5 MB

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

对于 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
}
);
}
};
}

您可以在声明中更改可接受的大小:

SetMaxPostSize (1000000) ;//10 MB

我知道这对于游戏来说已经非常晚了,但是我想要发布在使用 mysql 时遇到的额外问题,如果将来有人遇到同样的问题。

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

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

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

但是在修复 application.properties 之后,当上传一个大于4MB 的文件时会出现错误: Org.springframework.dao.例外情况: PreparedStatementCallback; SQL [插入 test _ doc (doc _ id,period _ of _ doc,doc _ version _ id,file _ name,doc)值(?,?,?,?,?)]查询数据包太大(6656781 > 4194304)。可以通过设置 max _ allow _ pack’variable. 在服务器上更改此值; 嵌套异常是 com.mysql.jdbc。PacketTooBigException: 用于查询的数据包太大(6656781 > 4194304)。可以通过设置 max _ allow _ pack’变量在服务器上更改此值。

所以我在 mysql 上运行了这个命令:

SET GLOBAL max_allowed_packet = 1024*1024*16;

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

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

如果必须使用 tomcat,那么最终可能会创建 嵌入式 ServletContainerCustomizer,这并不是一件好事。

如果你可以生活没有西红柿,你可以 用如回流的方式代替公猫和避免这个问题在所有。

我在专家交易所找到了解决方案,这对我来说很有效。

@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

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

我在使用 spring-boot-1.3.5.RELEASE,我也遇到了同样的问题。以上的解决方案对我都不管用。但是最终向 application.properties添加以下属性解决了这个问题。

multipart.max-file-size=10MB

为了避免这种异常,你可以借助 VM 参数,就像我在 Spring1.5.8中使用的那样。释放:

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

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

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

把这个放在你的 application.yml文件允许上传文件高达900MB

server:
servlet:
multipart:
enabled: true
max-file-size: 900000000  #900M
max-request-size: 900000000

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

与 Askerali Maruthullathil 的 回答对齐,这是我的工作方式(Spring 启动,Spring5.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;
}
}

我在 弹簧启动2.5.2中使用过这个配置,它工作得很好:

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

看看官方文件: https://spring.io/guides/gs/uploading-files/

如果您通过 Netflix Zuul edge 服务请求流,请确保在 Zuul 和您的文件上传服务中更新以下属性。

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

设置公猫的最大尺寸

server:
tomcat:
# unlimited
max-swallow-size: -1
max-http-form-post-size: -1