programing

Spring Controller @RequestBody 파일 업로드 가능합니까?

closeapi 2023. 10. 28. 07:57
반응형

Spring Controller @RequestBody 파일 업로드 가능합니까?

이런 컨트롤러가 있는데 아래와 같이 파일 업로드 양식과 라벨과 같은 양식 자료를 제출하고 싶습니다.또한, 저는 @RequestBody를 사용하여 더 많은 변수가 추가될 것이므로 포장지에 @Valid 주석을 사용할 수 있도록 하고 싶습니다.

public @ResponseBody WebResponse<Boolean> updateEUSettings(
    final Locale locale,
    @Validated @ModelAttribute final EUPSettingsWrapper endUserPortalSettingsWrapper) {
}

그리고 제 포장지는:

public class EUPSettingsWrapper {

    private String label;
    private MultipartFile logo;
// getter , setters..etc...
}

하지만 모델 속성에서 @RequestBody로 변환하고 싶습니다.

제가 시도하는 방법은 파일 업로드를 요청 매개변수로 분리하는 것입니다.

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

    endUserPortalSettingsWrapper.setLogo(logo);

    // ...
}

모의 MVC에서는 다음과 같이 설정합니다.

getMockMvc().perform(fileUpload(uri).file(logo)
                        .accept(MediaType.APPLICATION_JSON)
                        .content(JSONUtils.toJSON(wrapper))
                        .contentType(MediaType.MULTIPART_FORM_DATA))
                        .andExpect(status().isOk());

하지만 이런 오류가 발생하고 있습니다.

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data' not supported

멀티파트 파일 업로드가 @RequestBody에서 어떻게 사용될 수 있는지 아는 사람?위에 제가 잘못하고 있는 게 있나요?

일부 필드와 파일이 포함된 양식을 제출하는 것만 하면 되기 때문에 실제로 생활을 간소화할 수 있습니다.@RequestBody는 당신이 하려는 일을 위해 필요하지 않습니다.일반 Spring MVC 기능을 사용할 수 있으므로 컨트롤러 방식은 다음과 같습니다.

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


}

이 컨트롤러에 요청을 제출하는 클라이언트는 다음과 같은 양식을 가져야 합니다.enctype="multipart/form-data".

Spring MVC 테스트에서는 다음과 같이 적을 수 있습니다.

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());

spring-servlet.xml에 다음 bean을 추가하여 multipart 요청에 대한 지원을 추가하십시오.

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

또한 commons-file update jar에 대한 종속성을 추가하는 것도 잊지 마십시오.

@RequestBody를 사용할 방법을 찾을 수 없습니다.

그러나 다음과 같은 작업을 수행할 수 있습니다.

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

다음과 같이 테스트할 수 있습니다.

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());

저는 이 문제로 조금 힘들어하다가 결국 단순한 매개변수로 통과하게 되었습니다.요청 시 전달할 내용이 많지 않으면 괜찮습니다.

myMethod(@RequestParam("file") MultipartFile myFile,
        @RequestParam("param1") Float param1, @RequestParam("param2") String param2 {}

스프링 4 이상의 경우 다음을 수행하여 전체 개체를 가져올 수 있습니다.

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

}

참고: 또한 태그 없이 작동해야 합니다.

public ResponseEntity<Object> upload(EUPSettingsWrapper wrapper) {

}

언급URL : https://stackoverflow.com/questions/23533355/spring-controller-requestbody-with-file-upload-is-it-possible

반응형