복붙노트

[SPRING] Spring Reactive Web MVC가 Multipart-file을 처리하는 방법?

SPRING

Spring Reactive Web MVC가 Multipart-file을 처리하는 방법?

스프링 부트 2.0 응용 프로그램에서 새로운 반응 웹 -mvc 구현을 사용하려고합니다. multipart 파일을 사용하는 방법을 정의하려고 노력하고 있지만 성공하지 못합니다. (- 저는 항상 415 오류가납니다.

한 손에는 다음과 같은 요청 매핑을 포함하는 컨트롤러가 있습니다.

@RequestMapping(method = RequestMethod.POST, path = "/myPath/{param}/{param2}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseBody
public Mono<Void> postFile(
        @RequestBody MultipartFile data,
        @PathVariable("param") String param,
        @PathVariable("param2") String param2,
        @RequestHeader(name = HEADER_DATE, required = false)   @DateTimeFormat(pattern = DATE_FORMAT) Instant instant
){
    return fileService.handleData(Mono.just(data), param, param2, instant);
}

반면에 netty가 multipart 파일을 처리하지 않는 것처럼 기본 종속성의 맨 위에 서버를 추가해야했습니다. 필자는 spring-boot-starter-tomcatdependency를 추가하여 MultipartAutoConfiguration을 응용 프로그램 자동 구성과 일치시키고 만족시킬 수있게했습니다.

컬 (curl) 콜을 사용하여 무언가를 올릴 때 : curl 'Meta-Date : 20170101104532'--form "file=@file.bin"http : // localhost : 8082 / myPath / foo / bar 디버그 로그가 활성화되는 동안 (logging.level.org.springframework.web = DEBUG)이 예외가 발생했습니다 : org.springframework.web.server.UnsupportedMediaTypeStatusException : 요청 실패 [상태 : 415, 이유 : "콘텐츠 유형 'multipart / 양식 데이터, 경계 = ------------------- ----- 58fa43b8f1a26de4 '지원되지 않음']

이 오류는 [* / *, text / xml, application / * + json, charset = UTF-8, application / xml, text / plain, charset = UTF-8] 미디어 유형을 지원하는 RequestBodyArgumentResolver에 의해 발생합니다. , application / x-www-form-urlencoded, application / json, charset = UTF-8]에 의해 제공됩니다.

게시하기 전에 나는 또한 다음을 살펴 보았다.

Spring 4에서는 Spring 4 스프링 부트 응용 프로그램에서 이러한 클래스를 찾지 못했고, 아직 여러 DecartHttpMessageReader가 다중 파트 파일을 다루지 않았기 때문에 Spring Web 5.0은 새로운 요청 디코더 시스템을 사용합니다. 내가 뭘 놓 쳤니 ? 아니면 구현을 기다려야합니까?

해결법

  1. ==============================

    1.이제이 기능에 대한 풀 요청이 현재 존재하기 때문에 지금은 구현되지 않은 것 같습니다. 반응 멀티 파트 요청 지원 # 1201 추가

    이제이 기능에 대한 풀 요청이 현재 존재하기 때문에 지금은 구현되지 않은 것 같습니다. 반응 멀티 파트 요청 지원 # 1201 추가

    이걸 좀 더 일찍 확인해야 할거야 ...

    [편집] : 문제가 해결되었고 Spring master branch로 병합되었습니다. 더 이상 문제가되지 않아야합니다.

  2. ==============================

    2.

    @PutMapping(value="/{..}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Mono<Void> save(@RequestPart("file") FilePart multipartFormData,@RequestParam("fileName") String fileName,@PathVariable("..") String ..) throws IOException {        
            List<ByteBuffer> bytesList = new LinkedList<>();
    
            multipartFormData.content().
              subscribe(item->bytesList.add(item.asByteBuffer()));
    
            int totalBytes = bytesList.stream().mapToInt(item->item.capacity()).sum();
    
            ByteBuffer buffer =  ByteBuffer.allocate(totalBytes);
            bytesList.stream().forEach(byteBuff->buffer.put(byteBuff));
            baseImageHandler.saveImage(buffer, fileName, baseItemId);
            return Mono.empty();
        }
    

    그것은 dev 버전이지만이 방법으로 관리 할 수 ​​있습니다.

  3. from https://stackoverflow.com/questions/43066619/how-to-enable-spring-reactive-web-mvc-to-handle-multipart-file by cc-by-sa and MIT license