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