后续-文件编码错误
后来发现只是文件名称对了,但是内容不对。
本质上还是说本来是 utf8 的字节流,被强制转换成了 iso 编码。
源码分析
默认 springboot 的文件上传使用的是 CommonsFileUploadSupport 类。
这里有一段关于编码的内容:
protected String getDefaultEncoding() {
String encoding = getFileUpload().getHeaderEncoding();
if (encoding == null) {
encoding = WebUtils.DEFAULT_CHARACTER_ENCODING; //ISO-8859-1
}
return encoding;
}
所以我们需要修改默认的编码形式。
配置
我们自定义自己的实现类,而不是完全使用 sprign 默认的。
@Bean
public CommonsMultipartResolver commonsMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding(Constants.UTF_8);
resolver.setMaxUploadSize(500 * 1024 * 1024);
resolver.setMaxUploadSizePerFile(100 * 1024* 1024);
resolver.setMaxInMemorySize(100 * 1024 * 1024);
return resolver;
}
大小设置
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("100MB");
factory.setMaxRequestSize("100MB");
return factory.createMultipartConfig();
}
使用注意点
这个 https://developer.jboss.org/thread/252840 的报错和我遇到的很类似。
他说的解决方案竟然是:
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("100MB");
factory.setMaxRequestSize("100MB");
return factory.createMultipartConfig();
}
但是我如果同时配置 MultipartConfigElement & CommonsMultipartResolver 会报错找不到 file 信息,类似下面的文章。
Spring Boot中同时配置 MultipartConfigElement 和 CommonsMultipartResolver 文件上传会失败
(1)不可同时配置 MultipartConfigElement 和 CommonsMultipartResolver
(2)如果使用默认的 MultipartResolver(即使用Spring boot的自动配置),那么可以
在 application.properties或者使用 MultipartConfigElement 改变一些属性(如最大上传文件大小)
(3)如果自定义使用 CommonsMultipartResolver,可以直接指定其属性(内部是 FileUpload)
当然,这个最好和 commons-upload 结合使用。
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
其他配置
注意,此时应该把 springboot 默认的 StandardServletMultipartResolver
实现关闭。
@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
public class BootApplication extends SpringBootServletInitializer {
- application.properties
# 文件配置
spring.servlet.multipart.enabled=false
spring.http.multipart.max-request-size=50MB
spring.http.multipart.max-file-size=50MB
版本问题
今天把Spring boot版本升级到了2.0后,发现原来的文件上传大小限制设置不起作用了,原来的application.properties设置如下:
spring.http.multipart.max-file-size=100mb
spring.http.multipart.max-request-size=1000mb
Spring boot2.0的设置如下:
#设置上传APP的大小限制
spring.servlet.multipart.max-file-size=100Mb
spring.servlet.multipart.max-request-size=100Mb
jboss 文件大小限制
说明
11:05:40,526 INFO [stdout] (default task-13) Caused by: org.apache.commons.fileupload.FileUploadException: UT000020: Connection terminated as request was larger than 10485760
11:05:40,526 INFO [stdout] (default task-13) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
11:05:40,526 INFO [stdout] (default task-13) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:113)
11:05:40,526 INFO [stdout] (default task-13) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:159)
11:05:40,526 INFO [stdout] (default task-13) ... 86 common frames omitted
11:05:40,526 INFO [stdout] (default task-13) Caused by: java.io.IOException: UT000020: Connection terminated as request was larger than 10485760
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.conduits.FixedLengthStreamSourceConduit.checkMaxSize(FixedLengthStreamSourceConduit.java:168)
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.conduits.FixedLengthStreamSourceConduit.read(FixedLengthStreamSourceConduit.java:229)
11:05:40,526 INFO [stdout] (default task-13) at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.channels.DetachableStreamSourceChannel.read(DetachableStreamSourceChannel.java:209)
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.server.HttpServerExchange$ReadDispatchChannel.read(HttpServerExchange.java:2265)
11:05:40,526 INFO [stdout] (default task-13) at org.xnio.channels.Channels.readBlocking(Channels.java:294)
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.servlet.spec.ServletInputStreamImpl.readIntoBuffer(ServletInputStreamImpl.java:168)
11:05:40,526 INFO [stdout] (default task-13) at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:144)
11:05:40,526 INFO [stdout] (default task-13) at java.io.FilterInputStream.read(FilterInputStream.java:133)
应该是 Jboss 的限制导致的。
问题说明
搜索资料后发现jboss默认post请求最多只可以携带10M的数据,更改jboss的配置,修改post提交数据最大限制即可解决问题。
解决方案
修改步骤如下:
路径:wildfly-10.1.0.Final-thirdParty\standalone\configuration\standalone.xml
将此处
<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
修改为
<http-listener name="default" socket-binding="http" max-post-size="104857600" redirect-socket="https" enable-http2="true"/>
当然,也可以使用 shell 命令修改:
sed -i 's/\(http-listener.*\)\//\1\ max-post-size=\"59715200\"\//g' standalone.xml
参考资料
https://developer.jboss.org/thread/252840
Connection terminated as request was larger than 10485760.
Undertow文件上传10M以上抛异常UT000020: Connection terminated as request was larger than 10485760
Spring Boot中同时配置MultipartConfigElement和CommonsMultipartResolver文件上传会失败
SpringBoot中的multipartResolver上传文件配置
springboot使用CommonsMultipartResolver上传报错java.lang.ClassCastException
/** *
- https://blog.csdn.net/weixin_42733631/article/details/112600786
- https://www.cnblogs.com/charlypage/p/9858676.html
- https://blog.csdn.net/qq_36907589/article/details/108516431 *
- springBoot设置文件上传大小限制 *
- https://www.cnblogs.com/xy80hou/p/14011349.html
- @return this */
https://blog.csdn.net/qq_33243189/article/details/89631495