解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問題
MultipartResolver和ServletFileUpload沖突
如果同時(shí)使用了MultipartResolver 和ServletFileUpload,就會(huì)在iter.hasNext()返回false.然后整個(gè)循環(huán)就跳出去了。
整個(gè)問題產(chǎn)生的原因是Spring框架先調(diào)用了MultipartResolver 來處理http multi-part的請(qǐng)求。這里http multipart的請(qǐng)求已經(jīng)消耗掉。后面又交給ServletFileUpload ,那么ServletFileUpload 就獲取不到相應(yīng)的multi-part請(qǐng)求。
1.首先spring boot默認(rèn)會(huì)調(diào)用MultipartResolver
來處理http multi-part的請(qǐng)求,須在配置文件中把spring.http.multipart.enabled=false。這樣就不會(huì)默認(rèn)調(diào)用MultipartResolver。

2.需要重寫一個(gè)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的方法。如果這個(gè)返回值為true,那么Multipart http body就會(huì)MyMultipartResolver 消耗掉.如果這里返回false
* 那么就會(huì)交給后面的自己寫的處理函數(shù)處理例如剛才ServletFileUpload 所在的函數(shù)
* @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文件上傳時(shí)出現(xiàn)的“坑”—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>
然后,我們?cè)趐om文件中添加文件上傳用到的依賴文件:
<!--文件上傳依賴--> <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>
接著我們?cè)趕pring-mvc.xml文件中配置文件上傳解析器:
<bean id="commonsMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--上傳文件總大小--> <property name="maxUploadSize" value="54280"/> <!--編碼方式--> <property name="defaultEncoding" value="UTF-8"/> <!--單個(gè)上傳的文件大小--> <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));
}
這個(gè)時(shí)候你以為萬事大吉,可以成功運(yùn)行的時(shí)候,驚喜出現(xiàn)了,頁面給你來一個(gè)500…

idea控制臺(tái)給你來個(gè)null

我把代碼從頭順了一遍始終沒找到我的錯(cuò),于是乎,有技術(shù)朋友是真好?。?!原來在文件解析器那里ID必須要配置為
multipartResolver
*哈哈,加粗是為了醒目~~~~*
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--上傳文件總大小--> <property name="maxUploadSize" value="54280"/> <!--編碼方式--> <property name="defaultEncoding" value="UTF-8"/> <!--單個(gè)上傳的文件大小--> <property name="maxUploadSizePerFile" value="54280"/> </bean>
大家千萬記得這個(gè)!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot獲得Maven-pom中版本號(hào)和編譯時(shí)間戳
這篇文章主要介紹了詳解SpringBoot獲得Maven-pom中版本號(hào)和編譯時(shí)間戳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
淺談Java8 的foreach跳出循環(huán)break/return
這篇文章主要介紹了Java8 的foreach跳出循環(huán)break/return,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Springboot ApplicationRunner的使用解讀
這篇文章主要介紹了Springboot ApplicationRunner的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)定時(shí)任務(wù)的常用7中方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2023-06-06

