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
'programing' 카테고리의 다른 글
x-www-form-urlencoded를 사용하여 Angular2를 강제 POST하는 방법 (0) | 2023.11.02 |
---|---|
파일에 로컬 데이터 로드가 새 행을 추가하는 대신 mariadb 열 저장소의 이전 데이터를 바꿉니다. (0) | 2023.11.02 |
유튜브 동영상 URL을 코드 내장으로 변환 (0) | 2023.10.28 |
속성으로 인해 Java 코드가 컴파일되지 않습니다. 상수 식 오류여야 합니다. (0) | 2023.10.28 |
VBA를 사용하여 Excel의 셀에 텍스트 추가 (0) | 2023.10.28 |