31

I did a POC for spring 3 rest multipart file upload. Its working fine. But when i tried integrating with my application i am facing issues.

It throws following exception:

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**"

Please let me know if I am wrong in any part of my code.

Beans:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 <property name="order" value="1" />
 <property name="mediaTypes">
 <map>
   <entry key="json" value="application/json" />
   <entry key="xml" value="application/xml" />
   <entry key="file" value="multipart/mixed" />
 </map>
</property>
</bean>
<!-- multipart resolver -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- one of the properties available; the maximum file size in bytes -->
  <property name="maxUploadSize" value="50000000" />
 </bean>

Controller:

@Controller
public class MultipleFilesRecieve {
    @RequestMapping ( value = "/saveMultiple", method = RequestMethod.POST )
        public String save( FileUploadForm uploadForm ) {
        List<MultipartFile> files = uploadForm.getFiles( );
        List<String> fileNames = new ArrayList<String>( );
        if ( null != files && files.size( ) > 0 ) {
            for ( MultipartFile multipartFile : files ) {
                String fileName = multipartFile.getOriginalFilename( );
                fileNames.add( fileName );
            }
        }
        return "multifileSuccess";
    }
}
Vladimir Vagaytsev
  • 2,871
  • 9
  • 33
  • 36
Cherry
  • 341
  • 1
  • 5
  • 8

4 Answers4

36

The problem isn't in your code - it's in your request. You're missing boundary in your multipart request. As it said in specification:

The Content-Type field for multipart entities requires one parameter, "boundary", which is used to specify the encapsulation boundary. The encapsulation boundary is defined as a line consisting entirely of two hyphen characters ("-", decimal code 45) followed by the boundary parameter value from the Content-Type header field.

This and this posts should also be helpful.

Community
  • 1
  • 1
sermolaev
  • 975
  • 11
  • 23
5

@sermolaev is right in his answer.

I want to share my experience related to this problem. I've encountered this problem in Postman, but I could not understand the root cause for it for a long time. My request template seemed to be correct cause Postman included boundary in it...

Eventually I've discovered that when you're specifying Content-Type=multipart/form header by yourself, it overrides the one added automatically by Postman. And this leads to the same error as yours. My solution was as simple as removing Content-Type header.

naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
  • I wasted 1 day of searching in the web to realize that the answer is as simple as removing `Content-Type: multipart/form-data` from the Header in the Retrofit request. – Aliton Oliveira Jan 12 '21 at 22:51
1

Don't supply Content-Type header in the request. It will work.

Ankit Rai
  • 1,577
  • 1
  • 12
  • 24
0

Are you using any security filters? My problem was solved by removing the Security Filter Chain. From this:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(this.springSecurityFilterChain).build();

to this:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

I opened an issue where I explain the details: https://jira.spring.io/browse/SPR-12114

unify
  • 6,161
  • 4
  • 33
  • 34