排除在“enctype=‘multipart/form-data’”之外的MultipartException

前不久,在提交一份<form>表单以完成文件上传时,系统报了一个看上去比较常见的错误:

 1 HTTP Status [500] – [Internal Server Error]
 2
 3 Type Exception Report
 4
 5 Message Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request
 6
 7 Description The server encountered an unexpected condition that prevented it from fulfilling the request.
 8
 9 Exception
10
11 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request
12 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
13 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
14 javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
15 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
16 javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
17 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
18 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
19 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
20 Root Cause
21
22 org.springframework.web.multipart.MultipartException: Current request is not a multipart request
23 org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:190)
24 org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:109)
25 org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
26 org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:160)
27 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
28 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
29 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
30 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
31 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
32 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
33 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
34 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
35 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
36 javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
37 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
38 javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
39 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
40 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
41 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
42 Note The full stack trace of the root cause is available in the server logs.

反复确认后,确定表单中的确存在enctype=‘multipart/form-data‘属性,那么究竟是错在哪里呢?

1、经过排查,数据文件已经上传成功,文件夹和数据库皆有显示,可见CRUD、DAO和Service部分不太可能出现问题。

2、表单中的botton按钮(“type=submit”)可能将form提交多次,故将botton改成input,并用js提交表单。

 1 $("#subBtn").click(function(){
 2   /** 表单输入校验 */
 3   var pic = $("#pic");
 4   var msg = "";
 5
 6   // 判断表单元素
 7   if (pic.val() == ""){
 8     msg = "商品标题不能为空!";
 9   }
10
11   if (msg != ""){
12     alert(msg);
13     return;
14   }else{
15     $("#addCarouselFigureForm").submit();
16   }
17 });

经检验,错误依旧。

3、在后台方法代码中添加传入参数HttpRequest.HttpMethod,想要获取客户端使用的 HTTP 数据传输方法(如 GET、POST 或 HEAD)。不期返回了一个GET请求无效的错误。尝试失败。

4、最后把怀疑的地方定位到后台方法的return。

一开始代码是return到View视图地址,如下:

1 return "redirect:/admin/carouselFigure/addCarouselFigure";

改成不用redirect的地址(重写了一遍):

1 return "carouselFigure/carouselFigureList";

竟然能顺利跳转(虽然数据没有显示)。

后来一对比,发现是return的地址错误,又再次调用了本方法的RequestMapping请求。

总结:

报错大抵是千篇一律的,但是错误的行程却是千奇百怪。

“MultipartException: Current request is not a multipart request”这个错误除了没写“enctype=‘multipart/form-data”属性之外,还有可能是return返回错误。

日后还需多多细心检查。

时间: 2024-08-29 13:53:19

排除在“enctype=‘multipart/form-data’”之外的MultipartException的相关文章

上传文件form表单enctype=&quot;multipart/form-data&quot;传值解决办法(代原代码)

最近做的一个项目里遇到一个问 题,就是如何在上传文件的表单里传递其它的变量,因为一但form表单用了enctype="multipart/form-data"类型后,所有的值 都是以二进制进行传递的,所以当我们想取出这个表单里传递过来的其它变量的时候,就会遇到一个问题,那就是用request取不到传递过来的变量.在网上 找了很多资料,也都是大至说一下,在这里我就借花献佛发个完整的原代码解决这个问题!!! 工程目录如下: 两个jar可以去apache上下载: http://commons

form表单的enctype=‘multipart/form-data‘

enctype='multipart/form-data' HTML forms provide three methods of encoding. application/x-www-form-urlencoded (the default) multipart/form-data text/plain 上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上传表单要这么 写,知其然而不知其所以然. 那到底

form 中Enctype=multipart/form-data 的作用

ENCTYPE="multipart/form-data"用于表单里有图片上传. <form name="userInfo" method="post" action="first_submit.jsp"    ENCTYPE="multipart/form-data">表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如

表单form的enctype=&quot;multipart/form-data&quot;使用疑惑

在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时是不能用request.getParameter()来获取到各个表单元素的值的.可以通用这样(上传组件提供的API): boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) {  // Create a fa

form 中 Enctype=multipart/form-data 的作用

ENCTYPE="multipart/form-data"用于表单里有图片上传. 表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如下: <form name="userInfo" method="post" action="first_submit.php" ENCTYPE="multipart/form-data">

HTTP form表单提交数据(enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;)的服务端处理

参考链接:http://blog.csdn.net/u010018421/article/details/52833346 <form action="fileUploadServlet" enctype="multipart/form-data" method="post">     <input type="text" value="" name="inputName&quo

form &nbsp; 中 enctype=&quot;multipart/form-data&quot; 作用

<form name="userInfo" method="post" action="first_submit.jsp"    ENCTYPE="multipart/form-data"> 表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码. 如下: <tr> <td height="30" align=&

form enctype:&quot;multipart/form-data&quot;,method:&quot;post&quot; 提交表单,后台获取不到数据

在解决博问node.js接受参数的时候,发现当form中添加enctype:"multipart/form-data",后台确实获取不到数据,于是跑到百度上查了一下,终于明白为什么了,下面转载一下原因吧: 1.get方式 get方式提交的话,表单项都保存在http header中,格式是 http://localhost:8080/hello.do?name1=value1&name2=value2这样的字符串.server端通过request.getParameter是可以取

form表单中加上enctype=&quot;multipart/form-data&quot; 在servlet中get parameter(参数)返回空

1.首先说返回为空的问题: 这个我尝试多次才定位问题即使enctype="multipart/form-data"这句话引起的,但是我做的是文件上传必须加这句话. 后来各种百度 SmartUpload smartupload = new SmartUpload(); smartupload.initialize(config, request, response); smartupload.setMaxFileSize(2000000000L);//每个上传文件最大2MB; smart