Java 带多部分文件上载的Spring REST API不适用于可选参数

Java 带多部分文件上载的Spring REST API不适用于可选参数,java,spring,rest,file-upload,multipart,Java,Spring,Rest,File Upload,Multipart,我正在使用Spring框架,但对它不太熟悉。我正在编写一个RESTAPI,特别是一个POST方法,用于处理可选文件的文件上载 我试图简化这个方法,但仍然有问题。这是我的 @RequestMapping(method = RequestMethod.POST, value="/items") public String create(@RequestParam(value="file", required=false) MultipartFile file) { return "Creat

我正在使用Spring框架,但对它不太熟悉。我正在编写一个RESTAPI,特别是一个POST方法,用于处理可选文件的文件上载

我试图简化这个方法,但仍然有问题。这是我的

@RequestMapping(method = RequestMethod.POST, value="/items")
public String create(@RequestParam(value="file", required=false) MultipartFile file) {
    return "Create";
}
当我在表单请求中包含一个文件时,该方法工作正常,但是当我没有文件时(因为我希望它是可选的)。我已经尝试用
HttpServletRequest
参数替换
@RequestParam
,得到了相同的结果

我在以下堆栈跟踪中得到一个500错误:

java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Stream ended unexpectedly
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
</pre></p><p><b>root cause</b> <pre>org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Stream ended unexpectedly
    org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:99)
    org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.&lt;init&gt;(StandardMultipartHttpServletRequest.java:77)
    org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76)
    org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1067)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:906)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
</pre></p><p><b>root cause</b> <pre>java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Stream ended unexpectedly
    org.apache.catalina.connector.Request.parseParts(Request.java:2806)
    org.apache.catalina.connector.Request.parseParameters(Request.java:3096)
    org.apache.catalina.connector.Request.getParameter(Request.java:1145)
    org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
</pre></p><p><b>root cause</b> <pre>org.apache.tomcat.util.http.fileupload.FileUploadException: Stream ended unexpectedly
    org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:311)
    org.apache.catalina.connector.Request.parseParts(Request.java:2737)
    org.apache.catalina.connector.Request.parseParameters(Request.java:3096)
    org.apache.catalina.connector.Request.getParameter(Request.java:1145)
    org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
</pre></p><p><b>root cause</b> <pre>org.apache.tomcat.util.http.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
    org.apache.tomcat.util.http.fileupload.MultipartStream.readHeaders(MultipartStream.java:480)
    org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:889)
    org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.&lt;init&gt;(FileUploadBase.java:854)
    org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:259)
    org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:283)
    org.apache.catalina.connector.Request.parseParts(Request.java:2737)
    org.apache.catalina.connector.Request.parseParameters(Request.java:3096)
    org.apache.catalina.connector.Request.getParameter(Request.java:1145)
    org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:流意外结束
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javaservlet.http.HttpServlet.service(HttpServlet.java:646)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javaservlet.http.HttpServlet.service(HttpServlet.java:727)
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

根本原因org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常为java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:流意外结束 org.springframework.web.multipart.support.StandardMultipartTTpServletRequest.parseRequest(StandardMultipartTTpServletRequest.java:99) org.springframework.web.multipart.support.StandardMultipartTTpServletRequest.init(StandardMultipartTTpServletRequest.java:77) org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76) org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1067) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:906) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javaservlet.http.HttpServlet.service(HttpServlet.java:646) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javaservlet.http.HttpServlet.service(HttpServlet.java:727) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

根本原因java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:流意外结束 org.apache.catalina.connector.Request.parseParts(Request.java:2806) org.apache.catalina.connector.Request.parseParameters(Request.java:3096) org.apache.catalina.connector.Request.getParameter(Request.java:1145) org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

根本原因org.apache.tomcat.util.http.fileupload.FileUploadException:流意外结束 org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:311) org.apache.catalina.connector.Request.parseParts(Request.java:2737) org.apache.catalina.connector.Request.parseParameters(Request.java:3096) org.apache.catalina.connector.Request.getParameter(Request.java:1145) org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

根本原因org.apache.tomcat.util.http.fileupload.MultipartStream$MalformedStreamException:流意外结束 org.apache.tomcat.util.http.fileupload.MultipartStream.readHeaders(MultipartStream.java:480) org.apache.tomcat.util.http.fileupload.FileUploadBase$fileiteratorimpl.findNextItem(FileUploadBase.java:889) org.apache.tomcat.util.http.fileupload.FileUploadBase$fileiteratorimpl.init(FileUploadBase.java:854) org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:259) org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:283) org.apache.catalina.connector.Request.parseParts(Request.java:2737) org.apache.catalina.connector.Request.parseParameters(Request.java:3096) org.apache.catalina.connector.Request.getParameter(Request.java:1145) org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
我在网上的搜索中只找到了一篇帖子,上面说这可能是春天的一个bug。这个问题我已经解决了一段时间了,非常感谢您的帮助


谢谢

这是我最后得到的解决方案

@RequestMapping(method=RequestMethod.POST,value=“/object”)
ResponseEntity创建(@RequestParam(“is_文件”)布尔isFile,HttpServletRequest请求){
if(isFile){
MultipartTTpServletRequest multipartRequest=(MultipartTTpServletRequest)请求;
MultipartFile file=multipartrequues
@RequestMapping(method = RequestMethod.POST, value = "/object")
ResponseEntity<Object> create(@RequestParam("is_file") boolean isFile, HttpServletRequest request) {
    if(isFile) {
      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
      MultipartFile file = multipartRequest.getFile("file");
    } else{
      // You can add other parameters (as long as it isn't a multipart parameter) and do other stuff here
    }
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> upload(@RequestPart(value = "name", required = false) String name,
                                     @RequestPart(value = "file", required = false) MultipartFile file) 
@RequestMapping(method = RequestMethod.POST, value="/items")
public String create(@RequestParam(value ="file", required=false) MultipartFile file) {
    return "Create";
}