解決方案配置如下
<!-- 配置文件上傳解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 指定所上傳文件的總大小不能超過20M。注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 --> <property name="maxUploadSize" value="20000000"/> <property name="defaultEncoding" value="utf-8"></property> </bean> <!-- web.xml中引入上面配置,這個很重要!只有在contextConfigLocation配置的文件下的bean才會直接被加載供下面的過濾器調用 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/root-context.xml</param-value> </context-param> <!--form表單中存在文件時,該過濾器可以處理http請求中的文件,被該過濾器過濾后會用post方法提交,form表單需設為enctype="multipart/form-data"--> <filter> <filter-name>MultipartFilter</filter-name> <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> <init-param> <param-name>multipartResolverBeanName</param-name> <!--spring中配置的id為multipartResolver的解析器--> <param-value>multipartResolver</param-value> </init-param> </filter> <filter-mapping> <filter-name>MultipartFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--解析form表單中隱藏的name為_method的input,需放在MultipartFilter之后,才能在對應的put請求方法中找到對應的controller--> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
原理是過濾器是逐個進行的,先用MultipartFilter處理文件,在用HiddenHttpMethodFilter處理form表單中隱藏的name為_method的input。其次MultipartFilter配置的multipartResolverBeanName的值要在contextConfigLocation配置的xml中。
org.springframework.web.multipart.support.MultipartFilter會處理http請求中的文件流,無法解析_method參數。
org.springframework.web.filter.HiddenHttpMethodFilter可以解析form表單中隱藏的name為_method的input。