2015-02-10 1 views
2

Я использую Spring framework, но не слишком хорошо знаком с ним. Я пишу REST API, в частности метод POST, который обрабатывает загрузку файла, где файл является необязательным.Spring REST API с загрузкой файлов Multipart не работает для необязательного параметра

Я попытался упростить метод, но все еще имею проблему. Вот что у меня есть

@RequestMapping(method = RequestMethod.POST, value="/items") 
public String create(@RequestParam(value="file", required=false) MultipartFile file) { 
    return "Create"; 
} 

метод отлично работает, когда я включаю файл в моем запросе формы, однако, когда у меня нет файла (как я хочу, чтобы это было по желанию). Я попытался заменить @RequestParam параметром HttpServletRequest, дающим те же результаты.

я получаю ошибку 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) 

Я нашел только один пост в моем поиске в Интернете, и это говорит о том, что потенциально быть ошибка весной. Некоторое время я застрял в этой проблеме и буду очень благодарен за помощь.

Thanks

+0

Эта ошибка возникает только в Internet Explorer или во всех браузерах? Попробуйте добавить скрытое поле ввода в форму. Убедитесь, что это скрытое поле формы имеет фиктивное значение и находится в конце вашей формы. –

+0

У вас есть атрибут enctype в вашем сообщении формы? Какова его ценность? – Keerthivasan

+1

Я использовал приложение Chrome для проверки вызова. Я попробовал включить различные атрибуты enctype, чтобы не повезло. Я действительно понял, как это сделать. Я не знаю, насколько это оптимально. То, что я сделал, я сделал подпись метода не включать ничего, что использует Multipart, но вместо этого включил параметр для HttpServletRequest, а затем в теле я подвергал объект типу MultipartHttpServletRequest. Теперь я могу обрабатывать оба типа. Спасибо за ваши комментарии –

ответ

3

Вот решение, с которым я столкнулся.

@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 
    } 

}

2

я могу видеть, вопрос немного старый, но я положил мой ответ здесь, потому что загружая файлы темы всегда жив. Я тестировал Spring Boot 1.3.5.RELEASE в контексте этого вопроса. Я определил службу отдыха, как показано ниже, и работает, когда файл не подключен к multipart/form-data. Я протестировал сервис с клиентом RestTemplate.

@RequestMapping(method = RequestMethod.POST) 
public ResponseEntity<String> upload(@RequestPart(value = "name", required = false) String name, 
            @RequestPart(value = "file", required = false) MultipartFile file)