我正在使用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的服务器响应。
如何设置?
答案 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.maxFileSize
和multipart.maxRequestSize
参数设置为高于默认值的值。这可以在spring boot配置yml文件中完成。例如,将以下内容添加到application.yml
将允许用户上传10Mb文件:
multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb
如果用户需要能够在单个请求中上传多个文件且总数超过10Mb,那么您需要将multipart.maxRequestSize
配置为更高的值:
multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb
答案 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
答案 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();
}
答案 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_packet'变量来更改服务器上的此值。嵌套异常是com.mysql.jdbc.PacketTooBigException:查询包太大(6656781&gt; 4194304)。您可以通过设置max_allowed_packet'变量来更改服务器上的此值。
所以我从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();
}
}