Spring Downloading a download file with multiple files gives a poorly formatted multi-page request

I am currently working with Spring Boot v1.3.0.BUILD-SNAPSHOT and Spring v4.2.2.BUILD-SNAPSHOT.

If I try to upload multiple files (via angular):

myService.upload = function(name ,content) { var fd = new FormData(); fd.append('name', name); fd.append('file', content); return $http({ method: 'POST', url: SERVER_BASE_URL + 'upload', data: fd, transformRequest: angular.identity, headers: { 'Content-Type': 'multipart/form-data' }}).then(function(res) { return res.headers('Location'); }, function(reason) { throw reason; }); }; 

I get an error message:

[WARN] org.eclipse.jetty.server.Request - java.io.IOException: Missing start border of several parts on org.eclipse.jetty.util.MultiPartInputStreamParser.parse (MultiPartInputStreamParser.java:507) ~ [jetty-util-9.2 .13.v20150730.jar: 9.2.13.v20150730] on org.eclipse.jetty.util.MultiPartInputStreamParser.getParts (MultiPartInputStreamParser.java:400) ~ [jetty-util-9.2.13.v20150730.jar: 9.2.13. v20150730] at org.eclipse.jetty.server.Request.getParts (Request.java:2139) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.Request .extractMultipartParameters (Request.javahaps85) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.Request.extractContentParameters (Request.java.308) [jetty- server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.Request.extractParameters (Request.java:256) [jetty-server-9.2.13.v20150730.jar: 9.2. 13.v2015 0730] at org.eclipse.jetty.server.Request.getParameter (Request.java:825) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.springframework.web.filter.HiddenHttpMethodFilter .doFilterInternal (HiddenHttpMethodFilter.java:70) [spring -web-4.2.2.BUILD-SNAPSHOT.jar: 4.2.2.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter ) [spring -web-4.2.2.BUILD-SNAPSHOT.jar: 4.2.2.BUILD-SNAPSHOT] at org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1652) [jetty-servlet- 9.2.13.v20150730.jar: 9.2.13.v20150730] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:85) [spring -web-4.2.2.BUILD-SNAPSHOT.jar: 4.2. 2.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) [spring -web-4.2.2.BUILD-SNAPSHOT.jar: 4.2.2.BUILD-SNAPSHOT] on org .eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1652) [jetty-servlet-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.ja [jetty-servlet -9.2.13.v20150730.jar: 9.2.13.v20150730] on org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143) [jetty-server-9.2.13.v20150730.jar: 9.2 .13.v20150730] at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java∗77) [jetty-security-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty. server.session.SessionHandler.doHandle (SessionHandler.java:223) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler. java: 1127) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.javacla1515) [jetty-servlet-9.2.13 .v20150730.jar: 9.2.13.v20150730] on org.eclipse.jetty.server.session.SessionHand ler.doScope (SessionHandler.java:185) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1061) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141) [jetty-server-9.2.13.v20150730 .jar: 9.2.13.v20150730] on org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:97) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] on org.eclipse.jetty.server.Server.handle (Server.java:499) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.HttpChannel.handle ( HttpChannel.javahaps10) [jetty-server-9.2.13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:257) [jetty-server-9.2 .13.v20150730.jar: 9.2.13.v20150730] at org.eclipse.jetty.io.AbstractConnection $ 2.run (AbstractConnection.java∗40) [jetty-io-9 .2.13.v20150730.jar: 9.2.13.v20150730] on org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:635) [jetty-util-9.2.13.v20150730.jar: 9.2.13 .v20150730] at org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run (QueuedThreadPool.java► 555) [jetty-util-9.2.13.v20150730.jar: 9.2.13.30] 1507 on java.lang.Thread. run (Thread.java:745) [na: 1.8.0_45]

I added a multi-threaded bean converter:

 @Bean public FilterRegistrationBean openEntityManagerFilterRegistrationBean() { // Set upload filter final MultipartFilter multipartFilter = new MultipartFilter(); final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver"); return filterRegistrationBean; } @Bean public CommonsMultipartResolver commonsMultipartResolver() { final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); commonsMultipartResolver.setMaxUploadSize(-1); return commonsMultipartResolver; } 

However, it seems like the hiddenHttpMethodFilter is still being called before my multi-part converter:

[DEBUG] org.eclipse.jetty.servlet.ServletHandler - call filter symbolEncodingFilter [DEBUG] org.eclipse.jetty.servlet.ServletHandler - call filter hiddenHttpMethodFilter [WARN] org.eclipse.jetty.util.MultiParsInput multipleStream request

I tried adding @Order (0) to my Bean, but that didn’t affect it.

What else am I missing?

+6
source share
2 answers

I do not use a filter to upload files.

Try this approach here:

 // in configs @Bean    Public MultipartConfigElement multipartConfigElement () {        End MultipartConfigFactory factory = new MultipartConfigFactory ();        Factory.setMaxFileSize ( "50MB");        Factory.setMaxRequestSize ( "50MB");        Return factory.createMultipartConfig ();    } 

and

  // in controller @RequestMapping (value = "/ sendfile", method = RequestMethod.POST)    Public ModelAndView formSubmit (@RequestParam ( "file") MultipartFile file) { } 

Note. Do not forget to remove the filters that you placed in the configurations

I hope to help

+1
source

Well, that just means there is a problem with your angular js code. You will have to debug the browser, what exactly is sent, and, of course, it has no headers. Use tools like firebug. Try this code.

 var fd = new FormData(); fd.append('file', file); fd.append('data', 'string'); $http.post(uploadUrl, fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined} }) .success(function(){ }) .error(function(){ }); 

The following two properties of the configuration object are absolutely necessary:

 transformRequest: angular.identity 

overrides the default angular serialization series, leaving our data intact.

 headers: {'Content-Type': undefined } 

Allows the browser to determine the correct Content-Type as multipart / form-data and fill in the correct border.

0
source

All Articles