工作记录:图片上传,后台无法接收参数

一、问题描述

在项目中,有一个图片上传的功能,使用Base64来将图片解析成字符串,再放在请求体中传给接口。由于涉及到文件上传,首先是在spring-mvc.xml中设置了文件上传的大小。在自己测试过程中,上传图片的接口是可以正常使用的。然而,在发布到测试环境由测试人员进行集成测试的时候,发现该接口在上传高清图片时,接口会报错。

spring-mvc.xml 配置:


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    
	<property name="maxUploadSize" value="10485760"/>
	<property name="maxInMemorySize" value="4096"/>
bean>

二、问题排查

针对上传图片接口报错的问题,首先是去查看服务器上tomcat/logs/catalina.out的日志文件,发现拦截器打印的请求参数为空,即接口无法接收到前端传递的参数。之后打开chrome开发者工具时,并调用接口,发现前端请求接口时是有传递参数的,但是接口就是会无法获取到参数。之后带着问题去百度,找到了产生问题原因所在。
因为Tomcat默认的POST最大字节是2097152b(即2Mb),当上传的图片大于2M时,就会导致无法正常的进行请求,所以才会出现接口无法获取参数的问题
以下是Tomcat官网对于POST请求大小的描述

The maximum size in bytes of the POST which will be handled by the container FORM URL parameter parsing. The limit can be disabled by setting this attribute to a value less than zero. If not specified, this attribute is set to 2097152 (2 megabytes). Note that the FailedRequestFilter can be used to reject requests that exceed this limit.

详见 The Http Connector。
工作记录:图片上传,后台无法接收参数_第1张图片


三、问题解决

通过设置tomcat/conf/server.xml文件中的maxPostSize的值即可解决。

server.xml 配置


<Connector port="7061" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="7060" 
               useBodyEncodingForURI="true"
               URIEncoding="UTF-8"
               maxPostSize="10485760"/>

由于我在spring-mvc.xml中设置了文件上传的大小限制是10M。因此为了统一,将maxPostSize同样设置为10485760。如果想要禁用上传文件大小限制,可以将值设置为-1

参考:
tomcat7.0 文档
tomcat8.0 文档
tomcat8.5 文档
Tomcat下post请求大小设置

PS:

  • 本人使用的tomcat版本为8.5.31
  • 在网络上百度时,发现有一种解决方案是将maxPostSize设置为0,但是在设置之后,未起效。后来查阅了Tomcat官方的文档,文档上说明是将maxPostSize的值设置为小于零,即可禁用限制
  • 在完成上述配置之后,需要重启tomcat,让设置起效
  • 阅读此篇文章任何疑问、意见或建议,欢迎下方评论,我会及时回复。

你可能感兴趣的:(工作记录)