@RequestPart with mixed multipart request, Spring MVC 3.2

I'm developing a RESTful service based on Spring 3.2. I'm facing a problem with a controller handling mixed multipart HTTP request, with a Second part with XMLor JSON formatted data and a second part with a Image file .

I am using @RequestPart annotation for receiving the request

@RequestMapping(value = "/User/Image", method = RequestMethod.POST,  consumes = {"multipart/mixed"},produces="applcation/json")

public
ResponseEntity<List<Map<String, String>>> createUser(
        @RequestPart("file") MultipartFile file, @RequestPart(required=false) User user) {

    System.out.println("file" + file);

    System.out.println("user " + user);

    System.out.println("received file with original filename: "
            + file.getOriginalFilename());

    // List<MultipartFile> files = uploadForm.getFiles();
    List<Map<String, String>> response = new ArrayList<Map<String, String>>();
    Map<String, String> responseMap = new HashMap<String, String>();

    List<String> fileNames = new ArrayList<String>();

    if (null != file) {
        // for (MultipartFile multipartFile : files) {

        String fileName = file.getOriginalFilename();
        fileNames.add(fileName);

        try {
            file.transferTo(new File("C:/" + file.getOriginalFilename()));
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    responseMap.put("displayText", file.getOriginalFilename());
    responseMap.put("fileSize", "" + file.getSize());
    response.add(responseMap);

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.add("Accept", "application/json");
    return new ResponseEntity<List<Map<String, String>>>(response,
            httpHeaders, HttpStatus.OK);

}

User.java will be like this-

@XmlRootElement(name = "User")


public class User implements Serializable { 
    private static final long serialVersionUID = 1L;

    private int userId;
    private String name;
    private String email;

    private String company;
    private String gender;

    //getter setter of the data members
}

To my understanding, using the @RequestPart annotation I would expect the XML multipart section to be evaluated depending on its Content-Type and finally un-marshalled into my User class (I'm using Jaxb2, the marshaller/unmarhaller is properly configured in the application context and the procedure is working fine for all the other controller methods when I pass the XML data as body and use the @RequestBody annotation).

But what is actually happening is that, although the file is correctly found and parsed as MultipartFile, the "user" part is never seen and the request is always failing, not matching the controller method signature.

I reproduced the problem with several clients type and I am confident the format of the multipart request is ok.

Please help me to solve this issue, Maybe some workaround will be there to receive mixed/multipart request.

Thanks and Regards,

Raghvendra

I have managed to solve the problem

Endpoint example:

@PostMapping("/")
public Document create(@RequestPart Document document,
                       @RequestPart(required = false) MultipartFile file) {
    log.debug("#create: document({}), file({})", delegation, file);
    //custom logic
    return document;
}

Exception:

"error_message": "Content type 'application/octet-stream' not supported"

Exception is thrown from the next method:

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(HttpInputMessage,MethodParameter,Type)

Solution:

We have to create custom converter @Component, which implements HttpMessageConverter or HttpMessageConverter and knows about MediaType.APPLICATION_OCTET_STREAM. For simple workaround it's enough to extend AbstractJackson2HttpMessageConverter

@Component
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {

/**
 * Converter for support http request with header Content-Type: multipart/form-data
 */
public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
    super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
}

@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    return false;
}

@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
    return false;
}

@Override
protected boolean canWrite(MediaType mediaType) {
    return false;
}
}

RequestPart is always null with Multipart Request, Spring MVC 3.2.4, Answer is bit late, but could be useful still. This is what worked for me to attach both a payload and a file, with @RequestPart @RequestPart with mixed multipart request, Spring MVC 3.2 I'm developing a RESTful service based on Spring 3.2. I'm facing a problem with a controller handling mixed multipart HTTP request, with a Second part with XMLor JSON formatted data and a second part with a Image file .

Not sure if you had fixed your problem, but I also had a similar problem where my JSON object was not getting picked up by my controller when mixing @RequestPart and MultipartFile together.

The method signature for your call looks correct:

public ResponseEntity<List<Map<String, String>>> createUser(
        @RequestPart("file") MultipartFile file, @RequestPart(required=false) User user) {

// ... CODE ... 
}

However make sure your request looks something like this:

POST /createUser
Content-Type: multipart/mixed; boundary=B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E

--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E
Content-Disposition: form-data; name="user";
Content-Type: application/xml; charset=UTF-8

<user><!-- your user xml --></user>
--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E
Content-Disposition: form-data; name="file"; filename="A551A700-46D4-470A-86E7-52AD2B445847.dat"
Content-Type: application/octet-stream

/// FILE DATA
--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E--

#RequestPart with mixed multipart request, Spring MVC 3.2, I'm developing a RESTful service based on Spring 3.2. I'm facing a problem with a controller handling mixed multipart HTTP request, with a Second part with� I'm developing a RESTful service based on Spring 3.2. I'm facing a problem with a controller handling mixed multipart HTTP request, with a Second part with XMLor JSON formatted data and a second part with a Image file . I am using @RequestPart for rthe request

You can use @RequestPart from org.springframework.web.bind.annotation.RequestPart; It is used as Combining @RequestBody and file upload.

Using @RequestParam like this @RequestParam("file") MultipartFile file you can upload only file and multiple single data (key value ) like

    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST,  consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }, produces = { MediaType.APPLICATION_JSON_VALUE })
    public void saveFile(
                         @RequestParam("userid") String userid,
                         @RequestParam("file") MultipartFile file) {

    }

you can post JSON Object data and and File both using @RequestPart like

    @RequestMapping(value = "/patientp", method = RequestMethod.POST,  consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }, produces = { MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<?> insertPatientInfo(
                                            @RequestPart PatientInfoDTO patientInfoDTO,
                                            @RequestPart("file") MultipartFile file) {
}

You are not limited to using multipart file uploads directly as controller method parameters. Your form objects can contain Part or MultipartFile fields, and Spring knows automatically that it must obtain the values from file parts and converts the values appropriately.

Above method can respond to the previously demonstrated multipart request containing a single file. This works because Spring has a built-in HTTP message converter that recognizes file parts. In addition to the javax.servlet.http.Part type, you can also convert file uploads to org.springframework.web.multipart.MultipartFile. If the file field permits multiple file uploads, as demonstrated in the second multipart request, simply use an array or Collection of Parts or MultipartFiles.

        @RequestMapping(value = "/patientp", method = RequestMethod.POST,  consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }, produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<?> insertPatientInfo(
                                                @RequestPart PatientInfoDTO patientInfoDTO,
                                                @RequestPart("files") List<MultipartFile> files) {
    }

Happy To Help...

Problem with @RequestPart with mixed multipart request, Spring , Problem with @RequestPart with mixed multipart request, Spring MVC 3.2. Post by: Raghvendra Pratap Singh , Greenhorn. Apr 26, 2013� Please help me to solve this issue,May be some workaround will be there to receive mixed/multipart request. Problem with @RequestPart with mixed multipart request, Spring MVC 3.2 - Similar Threads FAQs

I have managed to solve problem:

    @SuppressWarnings("rawtypes")
@RequestMapping(value = "/DataTransfer", method = RequestMethod.POST, produces = {
        MediaType.APPLICATION_JSON_UTF8_VALUE }, consumes = {  MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE} )
@ApiOperation(value = "Sbm Data Transfer Service", response = Iterable.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successfully find."),
        @ApiResponse(code = 400, message = "There has been an error."),
        @ApiResponse(code = 401, message = "You are not authorized to save the resource"),
        @ApiResponse(code = 403, message = "Accessing the resource you were trying to reach is forbidden"),
        @ApiResponse(code = 404, message = "The resource you were trying to reach is not found") })
ResponseEntity processDataTransfer(@RequestPart(name="file") MultipartFile  file, @RequestPart(name="param") DataTransferInputDto param);

rest @RequestPart with mixed multipart request, Spring MVC 3.2 , I'm facing a problem with a controller handling mixed multipart HTTP request, to Problem with @RequestPart with mixed multipart request, Spring MVC 3.2. Browse other questions tagged spring rest spring-mvc content-type multipart or ask your own question. Featured on Meta Update: an agreement with Monica Cellio

have you tried

ResponseEntity<List<Map<String, String>>> createUser(
        @RequestPart("file") MultipartFile file, @RequestBody(required=false) User user) {

or

ResponseEntity<List<Map<String, String>>> createUser(
        @RequestPart("file") MultipartFile file, @RequestParam(required=false) User user) {

If this does not work can you show us mapping.xml

REST multipart mixed request (file+json) with Spring, rest @RequestPart with mixed multipart request, Spring MVC 3.2? ResponseEntity<List<Map<String, String>>> createUser( @RequestPart("file") MultipartFile� Using the above method I can upload a multipart file, but if i upload a chunked file I get an exception from spring that says: org.springframework.web.multipart.MultipartException: \ The current request is not a multipart request If I remove the MultipartFile request param it works great for transfer encoding chunked.

java, spring mvc multipart request with json spring MultipartFile file, @RequestPart(" map") String map, HttpServletResponse response) throws Exception { } } that way you can send a byte array in your post (this code works with Spring 3.2.3):� On a side note, I am using @ResponseBody to send the String response for this web request, this is done to keep the example simple. Like I always do, I will use these methods in Spring MVC application and test them with a simple program or script. @RequestMapping with Multiple URI: We can use a single method for handling multiple URIs, for example:

RequestPart (Spring Framework 5.2.7.RELEASE API), Post comme une forme multipart du JavaScript et utiliser quelque chose comme ceci: final WebRequest webRequest, @RequestParam("fileContent") final� In Spring MVC application, it is very much common that we need to upload the file. So it provides a simple way for doing it. We need to follow below 4 steps to make the file upload successfully in Spring MVC. 1)Add the file upload field in the form using input type as file <

17. Web MVC framework - Project Metadata API Guide, Annotation that can be used to associate the part of a "multipart/form-data" request with a method argument. Supported method argument types include� Request sent by the client is syntactically incorrect. How to develop doPut() Servlet Problem with @RequestPart with mixed multipart request, Spring MVC 3.2

Comments
  • Did you ever try with consumes = {"multipart/form-data"}?
  • @StijnGeukens I tried that and didn't work either.
  • It's 2019 and this solution solved the @RequestPart issue I had today.
  • @Maksim Why did you override these methods?
  • @RamanPreetSingh we do not want this converter to be used for writes, we only need to read correctly a request.
  • I am using Spring RESTful webservices to get multipart data and the object. Do you have any idea for this?
  • Maybe add some explnation about your code, why does it solve the question, maybe some docs