解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問(wèn)題
MultipartResolver和ServletFileUpload沖突
如果同時(shí)使用了MultipartResolver 和ServletFileUpload,就會(huì)在iter.hasNext()返回false.然后整個(gè)循環(huán)就跳出去了。
整個(gè)問(wèn)題產(chǎn)生的原因是Spring框架先調(diào)用了MultipartResolver 來(lái)處理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
來(lái)處理http multi-part的請(qǐng)求,須在配置文件中把spring.http.multipart.enabled=false。這樣就不會(huì)默認(rèn)調(diào)用MultipartResolver。
2.需要重寫(xiě)一個(gè)MyMultipartResolver
重寫(xiě)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ì)交給后面的自己寫(xiě)的處理函數(shù)處理例如剛才ServletFileUpload 所在的函數(shù) * @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest) */ @Override public boolean isMultipart(HttpServletRequest request) { // 過(guò)濾金格生成文書(shū)保存的接口 兼容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
首先,頁(yè)面代碼,這里是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>
之后編寫(xiě)了文件上傳代碼:
@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í)候你以為萬(wàn)事大吉,可以成功運(yùn)行的時(shí)候,驚喜出現(xiàn)了,頁(yè)面給你來(lái)一個(gè)500…
idea控制臺(tái)給你來(lái)個(gè)null
我把代碼從頭順了一遍始終沒(méi)找到我的錯(cuò),于是乎,有技術(shù)朋友是真好!!!原來(lái)在文件解析器那里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>
大家千萬(wàn)記得這個(gè)!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java web實(shí)現(xiàn)郵箱激活與忘記密碼
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)郵箱激活與忘記密碼、重置密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02介紹下Java Spring的核心接口,容器中Bean的實(shí)例化
這篇文章主要介紹了Spring核心接口,容器中bean的實(shí)例化過(guò)程解析及完整代碼示例,簡(jiǎn)單分析實(shí)例化bean過(guò)程并且分享了相關(guān)實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java concurrency之CountDownLatch原理和示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
CountDownLatch是一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。 下面通過(guò)本文給大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友參考下吧2017-06-06Mybatis?大數(shù)據(jù)量批量寫(xiě)優(yōu)化的案例詳解
這篇文章主要介紹了Mybatis?大數(shù)據(jù)量批量寫(xiě)優(yōu)化的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05spring?Cloud微服務(wù)阿里開(kāi)源TTL身份信息的線程間復(fù)用
這篇文章主要為大家介紹了spring?Cloud微服務(wù)中使用阿里開(kāi)源TTL身份信息的線程間復(fù)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01java實(shí)現(xiàn)簡(jiǎn)單登錄界面的實(shí)戰(zhàn)過(guò)程
學(xué)習(xí)JAVA的過(guò)程當(dāng)中,登陸界面是多數(shù)人第一個(gè)實(shí)現(xiàn)的小程序,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)簡(jiǎn)單登錄界面的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Java基于中介者模式實(shí)現(xiàn)多人聊天室功能示例
這篇文章主要介紹了Java基于中介者模式實(shí)現(xiàn)多人聊天室功能,詳細(xì)分析了中介者模式的概念、原理以及使用中介模式實(shí)現(xiàn)多人聊天的步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05