无法解析多部分servlet请求,嵌套异常为org.apache.commons.fileupload.FileUploadException

use*_*817 5 spring-mvc

通过使用CommonsMultipartResolver库在Spring中上传10 MB大小的csv文件时遇到错误。我已经在xml文件Xml File Confi中进行了以下设置:

 <beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- max upload size in bytes -->
<beans:property name="maxUploadSize" value="99971520" /> <!-- 99MB -->

<!-- max size of file in memory (in bytes) -->
<beans:property name="maxInMemorySize" value="1048576" /> <!-- 1MB -->
Run Code Online (Sandbox Code Playgroud)

控制器代码:

 @RequestMapping(value="/uploadForm",method = RequestMethod.POST)
public @ResponseBody  String  uploadForm1(@ModelAttribute("admin") BillingAndRecon  billingandrecon,@RequestParam String id,BindingResult result,Principal principal,@RequestParam MultipartFile file,HttpSession session) throws ServiceException, DaoException, IllegalStateException, IOException {


    File uploadFile = null;
    String msg = "";

    if (!file.getOriginalFilename().equals("")) {

        logger.info("Before  Multipart file get path >> ");
        BillingAndReconServiceImpl asi = (BillingAndReconServiceImpl) this.billingAndReconService;// not correct!!
        String uploadDirectoryPath = asi.getUploadDirectoryPath(); // not correct!!

        uploadFile = new File( uploadDirectoryPath + file.getOriginalFilename());
        logger.info("Before  Multipart file get path uploadDirectoryPath >> "+uploadDirectoryPath);
        file.transferTo(uploadFile);
    }
}
Run Code Online (Sandbox Code Playgroud)

表单页面:

<form:form action="./uploadForm" method="post" enctype="multipart/form-data" ModelAttribute=="admin">
          <input type="file" name="file" />
          <input type="text" name="id" />
           </form:form>
Run Code Online (Sandbox Code Playgroud)

但是我不明白什么是问题。我也尝试设置大小和设置标头enctype="multipart/form-data",但尚未解决。

以下是错误:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found] with root cause org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:954)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:892)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)

Abh*_*yak 2

正如@ChristianMaioliM在评论中所请求的那样,添加了有关\n代码中的问题的更多详细信息是BindingResult 参数不遵循模型对象

\n\n
\n

Errors 或 BindingResult 参数必须遵循立即绑定的模型对象,因为方法签名可能有多个模型对象,Spring 将为每个模型对象创建一个单独的 BindingResult 实例,因此以下示例不会\xe2\x80\x99t工作

\n
\n\n

请参阅文档BindingResult 和 @ModelAttribute 的无效排序

\n\n

要解决此问题,请更改控制器方法处理程序签名以遵循 BindingResult 和模型对象之间的参数顺序,例如:

\n\n

从:

\n\n
@RequestMapping(value="/uploadForm",method = RequestMethod.POST)\npublic @ResponseBody  String  uploadForm1(@ModelAttribute("admin") BillingAndRecon  billingandrecon,@RequestParam String id,BindingResult result,Principal principal,@RequestParam MultipartFile file,HttpSession session) throws ServiceException, DaoException, IllegalStateException, IOException {\n
Run Code Online (Sandbox Code Playgroud)\n\n

到:

\n\n
@RequestMapping(value="/uploadForm",method = RequestMethod.POST)\npublic String  uploadForm1(\n            @ModelAttribute("admin") BillingAndRecon billingandrecon, \n            BindingResult result,\n            Principal principal,\n            HttpSession session) throws ServiceException, DaoException, IllegalStateException, IOException {\n  //do file save here\n  return "some-view-name";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并在 BillingAndRecon 类中添加多部分/绑定字段,例如:

\n\n
public class BillingAndRecon {\n  private MultipartFile file;\n  private String id;\n\n  no-arg constructor;\n  getters;\n  setters;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意: BindingResult 参数应该紧接在@ModelAttrubiute/@RequestBody

\n\n

和jsp形式:

\n\n
<form:form action="${pageContext.request.contextPath}/uploadForm"  \n   method="post" \n   enctype="multipart/form-data" \n   modelAttribute="admin">\n      <input type="file" name="file" />\n      <form:input path="id" />\n</form:form>\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且不要忘记在 GET 处理程序中添加绑定实例,例如:

\n\n
@RequestMapping(value="/uploadForm",method = RequestMethod.GET)\npublic String uploadFormView(Model model){\n  model.addAttribute("admin", new BillingAndRecon());\n  return "your-upload-view-name";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 请解释你的答案,不要只是发布“这样做”,否则其他有类似问题的人将无法理解你的实现背后的想法。 (10认同)