上传3M以上文件会失败的问题定位和解决办法

遇到的问题

功能实现

内部使用的测试工具平台,实现架构为:前端react,后端springMVC。

问题现象

使用测试工具平台的上传文件的功能时,上传小体积的文件时,功能正常;但是,当上传大于3M的附件时会失败。

上传大于3M附件时,前端提示后端返回了一个302跳转,跳转到一个通用错误页URL。而后端查看日志,发现没有Controller层的请求日志。

知识梳理

从前端发送请求到后端处理请求的过程,其中对请求体积大小的影响比较关键的环节有:

1.前端的JS代码

在处理逻辑中可能对上传文件体积进行限制;

2.浏览器

HTTP协议对get或者post参数的大小其实是没有限制的。

但是,各个浏览器对get参数的长度支持是有限的,
各个浏览器的实现不同,大约是在KB级别,例如IE大约是2KB;

post则不受限制。

3.Nginx

后端服务器的前端,一般会使用Nginx来作为反向代理,来实现负载均衡等功能。

在nginx.conf配置中的server节中,会使用client_max_body_size字段来限制客户端请求服务器最大的允许大小,该字段的单位可以自定义,例如:20m。

4.Tomcat

后端一般使用Tomcat作为web容器。

在Tomcat的server.conf配置中,在<Connector/>标签内会使用maxPostSize属性来表示最大的Post体大小。该属性的单位为Byte,设置为-1表示不作任何限制。(Tomcat 7.0.63之前使用0或者负数均可以表示大小不作限制,7.0.63版本及之后的版本只可以使用负数来表示大小不作限制)

5.后端的Java代码

在框架中会对请求大小有限制,在逻辑代码中也可以进行大小限制的处理。

对于springboot框架,在application.properties中通过以下2个字段来设置:

# 多文件上传最大值
spring.http.multipart.max-request-size=200MB
# 单文件上传最大值
spring.http.multipart.max-file-size=50MB

对于MVC框架,在spring配置中通过如下方式来设置:

	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 配置上传文件最大尺寸,单位为Byte -->
		<property name="maxUploadSize" value="524288000" />
	</bean>

问题定位和解决办法

通过对以上涉及的环节排查,发现机器上的Nginx配置偏小。

登陆服务器机器后,按照如下方式查询,实际结果如下:

# 查询Nginx配置:
$grep 'client_max_body_size' ./nginx.conf
    client_max_body_size    3m;

所以,当上传文件大于3M时,会被Nginx拦截出现错误。

针对该问题,修改Nginx配置后,重新加载配置文件即可生效:nginx -s reload

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页