已经围绕这个主题搜索并尝试了很多帖子......寻求帮助
这是一个在 Tomcat 10 中运行的 Spring 6 应用程序,使用接受多部分文件的 servlet,我们会收到此错误。下面是关键配置项和代码的列表:
错误:
08:51:46.440 [https-jsse-nio-9443-exec-29]警告org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - 已解决[org.springframework.web.multipart.MaxUploadSizeExceededException:最大上传大小超出
文件大小限制在 1.5MB 左右(不是 128KB)
/src/resources/application.properties 包含:
spring.servlet.multipart.max-file-size=10485760
spring.servlet.multipart.max-request-size=10485760
spring.servlet.multipart.file-size-threshold=10485760
server.tomcat.max-swallow-size=-1
server.tomcatmax-http-form-post-size=-1
app-context.xml 包含:
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>
tomcat context.xml 包含:
<Context path="gearlog" useHttpOnly="false" allowCasualMultipartParsing="true">
所有包含接受多部分文件的方法的 servlet 都包含:
@Controller
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024*100,
maxFileSize=1024*1024*100, maxRequestSize=1024*1024*5*100)
public class...
我们所做的一切似乎都没有任何改变。我们可以上传大约 1.5MB 的文件。任何大于此值的值都会出现此错误
这个问题不是关于什么的(以消除有关该主题的许多帖子的歧义)
不是要添加限制。我们的问题是我们无法增加限制
不是优雅地处理违反限制的行为。首先,我们需要将限制提高到合理的水平!
不是关于使用 CommonsMultipartResolver - 当我们升级到 Spring 6 并且这些问题开始出现时,它就消失了
非常感谢任何帮助,因为我已经为此苦苦思索好几天了:(
回答我自己的问题,以防将来对其他人有帮助
(a) 该应用程序有一些 spring-boot 依赖项,但不是 spring-boot 应用程序,因此 application.properties 是一个死胡同 (b) 将以下内容添加到 Web.xml 中的 servlet 调度程序可以正常工作,因为它将请求转发到控制器时会禁用限制 (c) 在控制器上的 @MultipartConfig 中设置限制从未起作用,因为限制是在调度期间施加的 - 即在到达控制器之前 - 至少这就是我认为它不起作用的原因
最终解决方案(对我来说)是更新 web.xml 如下
<servlet>
<servlet-name>api-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/api-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<location>/var/tmp</location>
<max-file-size>104857600</max-file-size>
<max-request-size>104857600</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>api-dispatcher</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>