Spring Controller @RequestBody with file upload is it possible?

前端 未结 5 1605
说谎
说谎 2020-12-12 23:55

I have a Controller like this and I want to submit a form with file uploading as well as some form data like label as shown below. Also, I want to do that using @RequestBody

相关标签:
5条回答
  • 2020-12-13 00:35

    You can actually simplify your life here since all you are doing is submitting a form that contains some fields and file. You don't need @RequestBody for what you are trying to do. You can use regular Spring MVC features, so your controller method would look like:

    @ResponseBody
    public WebResponse<Boolean> updateEUSettings(
         Locale locale, 
         @Valid EUPSettingsWrapper endUserPortalSettingsWrapper, 
         @RequestParam(value = "file1", required = true) MultipartFile logo
    ) {
    
    
    }
    

    The client that submits the request to this controller will need to have a form with enctype="multipart/form-data".

    In your Spring MVC test you would write something like this:

    getMockMvc().perform(fileUpload(uri).file("file1", "some-content".getBytes()) 
                            .param("someEuSettingsProperty", "someValue")
                            .param("someOtherEuSettingsProperty", "someOtherValue")
                            .accept(MediaType.APPLICATION_JSON)
                            .contentType(MediaType.MULTIPART_FORM_DATA))
                            .andExpect(status().isOk());
    
    0 讨论(0)
  • 2020-12-13 00:40

    I struggled a little with this and ended up passing as simple parameters. Fine if you don't have lots to pass in your request:

    myMethod(@RequestParam("file") MultipartFile myFile,
            @RequestParam("param1") Float param1, @RequestParam("param2") String param2 {}
    
    0 讨论(0)
  • 2020-12-13 00:42

    I couldn't find a way to use @RequestBody.

    However, you can do something like this:

    @RequestMapping(value = "/uploadStuff", method = RequestMethod.POST)
    public MyViewDto doStuff(@RequestPart("json") @Valid MyDto dto,
                             @RequestPart("file") MultipartFile file) { ... }
    

    You can test it like this:

    MockMultipartFile jsonFile = new MockMultipartFile("json", "",
                "application/json", "{}".getBytes());
    MockMultipartFile dataFile = new MockMultipartFile("file", "foo.zip", "application/octet-stream", bytes);
    
    mockMvc.perform(fileUpload("/uploadStuff")
                .file(dataFile)
                .file(jsonFile))
                .andExpect(status().isOk());
    
    0 讨论(0)
  • 2020-12-13 00:45

    Please add the following bean in your spring-servlet.xml to add the support for multipart request.

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
    

    Also don't forget to add the dependency for commons-fileupload jar

    0 讨论(0)
  • 2020-12-13 00:53

    For Spring 4 and later you can do the following to get the full object:

    public ResponseEntity<Object> upload(@Payload EUPSettingsWrapper wrapper) {
    
    }
    

    Note: Also should work without the tag

    public ResponseEntity<Object> upload(EUPSettingsWrapper wrapper) {
    
    }
    
    0 讨论(0)
提交回复
热议问题