解决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


猜你喜欢
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- 遇到一个@ConditionalOnMissingBean失效的问题,今天花点时间来分析一下。现场回放services首先介绍下代码结构:有
- 需要为项目提供一套畸变校正的算法,由于需要大量的矩阵运算,考虑到效率和适时性,使用JNI开发,希望把有关数组短阵的处理的变换全部放入C语言中
- Android通过wifi连接手机的方法,供大家参考,具体内容如下1.首先电脑,手机连接同一个网络2.在Android studio中Ter
- 实践过程效果代码class BaseClass{ public class Win32
- C++ 中String 替换指定字符串的实例详解C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串
- 通常在 java 中对文本、网络资源等操作起来是很繁杂的,要声明,读取,关闭三个阶段,还得考虑异常情况。假设我们要读取一段文本显示到控制台,
- 一、java发展史1.java之父:詹姆斯·高家林2.关键时间点:1996年Java(1.0)发布,2004年Java(5.0)发扬光大,2
- WebFlux服务编排WebFlux 服务编排是指使用 WebFlux 框架来编排多个异步服务的执行顺序和数据流动,从而构建出一个完整的、基
- 如果不考虑更深层的性能问题,我个人认为ScrollerView还是很好用的。而且单用ScrollerView就可以实现分类型的Recycle
- 任何简单操作的背后,都有一套相当复杂的机制。本文将以SpringBoot应用的在Docker环境下的打包部署为例,详细讲解如何使用Jenki
- 本实例将显示类似于windows7提供的图片预览窗格效果,单击任意一张图片,可以在右侧显示该图片的预览效果。效果如图所示:具体实现方法:re
- c#调用surfer软件,添加应用的方法:1.在项目文件上右键->添加引用2.选择COM标签页3.找到Surfer 9 type li
- 本文实例为大家分享了C#实现俄罗斯方块的具体代码,供大家参考,具体内容如下1.调色板代码namespace Tetris{ class Pa
- 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间
- 一、概述在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依
- 最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^一:首
- 本文实例为大家分享了Android Studio实现简单计算器功能的具体代码,供大家参考,具体内容如下程序步骤:(1)在布局文件定义一些计算
- 简述Java中Socket分为普通Socket和NioSocket两种,这里介绍Socket。我们可以把Socket比作两个城市间的交通工具
- 前言在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert