天天看點

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

Spring MVC 3.1以後版本 MultipartFile的一個問題

使用Spring web MVC的時候,請求參數到方法參數的綁定是個很好用的特性。

下面是一個你可能會遇到的問題:

@RequestMapping(value = "/upload", method = RequestMethod.POST)

public ResultView upload(@RequestParam(value = "file", required = false) MultipartFile file)

于是你會認為,參數file的required屬性已經是false,送出multipart請求或者送出form-data請求都可以。 事實不是這樣的,在spring 3.1以後,如果請求是普通post,即使參數被标記了required=false,也會出錯。 這是一個普通post請求的異常堆棧

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.assertIsMultipartRequest(RequestParamMethodArgumentResolver.java:185)

    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:150)

    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:86)

    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)

    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)

    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123)

    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)

    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)

    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)

    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)

    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)

    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

... 後面堆棧資訊省略

Spring在處理請求映射的時候,如果發現某個請求參數是MultipartFile類型的,會判斷請求是否是MultipartHttpServletRequest,如果請求不是這個類型,即使參數不是必須的(required=false),也會抛出異常。

【解決:】在<form>表單送出處添加 enctype="multipart/form-data"

<form name="userForm1" action="/springMVC7/file/upload" enctype="multipart/form-data" method="post"> …… </form> 

繼續閱讀