解决SpringBoot中MultipartResolver和ServletFileUpload的冲突问题
作者:wmy_0707 发布时间:2023-10-22 15:28:19
标签:SpringBoot,MultipartResolver,ServletFileUpload
MultipartResolver和ServletFileUpload冲突
如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。
1.首先spring boot默认会调用MultipartResolver
来处理http multi-part的请求,须在配置文件中把spring.http.multipart.enabled=false。这样就不会默认调用MultipartResolver。
2.需要重写一个MyMultipartResolver
重写isMultipart方法
package dc.platform.admin.common.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
@Configuration
public class MyMultipartResolver extends CommonsMultipartResolver {
/**
* 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http body就会MyMultipartResolver 消耗掉.如果这里返回false
* 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数
* @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest)
*/
@Override
public boolean isMultipart(HttpServletRequest request) {
// 过滤金格生成文书保存的接口 兼容MultipartResolver 或者 ServletFileUpload
if (request.getRequestURI().contains("mgt/document/upload")||request.getRequestURI().contains("/modules/document.html")) {
return false;
}
return super.isMultipart(request);
}
}
springMVC文件上传时出现的“坑”—multipartResolver
首先,页面代码,这里是upload.jsp:
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name">
文件:<input type="file" name="multipartFile">
提交: <input type="submit" value="提交">
</form>
然后,我们在pom文件中添加文件上传用到的依赖文件:
<!--文件上传依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
接着我们在spring-mvc.xml文件中配置文件上传解析器:
<bean id="commonsMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件总大小-->
<property name="maxUploadSize" value="54280"/>
<!--编码方式-->
<property name="defaultEncoding" value="UTF-8"/>
<!--单个上传的文件大小-->
<property name="maxUploadSizePerFile" value="54280"/>
</bean>
之后编写了文件上传代码:
@RequestMapping("/upload")
@ResponseBody
public void upload(String name, MultipartFile multipartFile) throws IOException {
System.out.println(name);
String filename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File("F:\\"+filename));
}
这个时候你以为万事大吉,可以成功运行的时候,惊喜出现了,页面给你来一个500…
idea控制台给你来个null
我把代码从头顺了一遍始终没找到我的错,于是乎,有技术朋友是真好!!!原来在文件解析器那里ID必须要配置为
multipartResolver
*哈哈,加粗是为了醒目~~~~*
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件总大小-->
<property name="maxUploadSize" value="54280"/>
<!--编码方式-->
<property name="defaultEncoding" value="UTF-8"/>
<!--单个上传的文件大小-->
<property name="maxUploadSizePerFile" value="54280"/>
</bean>
大家千万记得这个!
来源:https://blog.csdn.net/wmy_0707/article/details/84313488
0
投稿
猜你喜欢
- 背景众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重
- spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>、&
- mport java.text.DecimalFormat; DecimalFormat &nb
- 本文由Markdown语法编辑器编辑完成。1. 需求分析;已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回X
- 这篇文章主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 简介在文章《GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动》中,我们介绍了如何使用
- C++11 引入一个全新的线程库,包含启动和管理线程的工具,提供了同步(互斥、锁和原子变量)的方法,我将试图为你介绍这个全新的线
- 定义在一幅无向图G=(V,E) 中,(u,v) 为连接顶点u和顶点v的边,w(u,v)为边的权重,若存在边的子集T&am
- 今天去某在线教育面试面试官让做的一道题,题目描述如下:给定一个不重复的无序数组arr和一个定值num查找arr中是否有两个数的和等于num有
- 本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下第一段:package com.
- 你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?别急,这篇文章
- Java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于
- 本博文将为您提供自Java 7以来增加的很棒的新功能的示例。我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java
- 我们都知道单精度浮点数(Single,float,Real)由32位0或1组成,它具体是如何来的。浮点数的32位N=1符号位(Sign)+8
- 一. 为什么要使用接口假如有一个需求:要求实现防盗门的功能。门有"开"和"关"的功能,锁有"
- java 闰年判断前言:给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1. 年份是4的倍数而不是100的倍数;2.
- Spring Boot1.为什么要使用 Spring Boot因为Spring, SpringMVC 需要使用的大量的配置文件 (xml文件
- SharedPreferences在开发过程中,数据存取是较为频繁的,今天我们来了解下android几种常见的数据存取方式。在Android
- springboot多模块化整合mybatis,mapper自动注入失败问题启动类添加@MapperScan或@ComponentScan,
- C++对string进行大小写转换操作方法方法一:使用C语言之前的方法,使用函数,进行转换#include <iostream>