REST를 통해 파일 데이터가있는 복잡한 객체를 전달하는 방법

2021. 2. 22. 22:44카테고리 없음

REST를 통해 파일 데이터가있는 복잡한 객체를 전달하는 방법

1. 질문(문제점):

한 소스에서 파일을 다운로드하고 나머지를 통해이 데이터를 다른 응용 프로그램에 전달해야합니다. 파일 유형은 .txt .csv 및 .zip입니다. 파일 크기는 최대 500Mb-1Gb입니다.

이를 수행하는 최적의 방법은 무엇입니까? 처음에 Java File 객체를 바이트 배열로 변환해야합니까? Multipart 컨텐츠 유형이이 목적에 가장 적합한 유형입니까? 전송할 클래스가 다른 파일 유형을 포함 할 수 있기 때문에 약간 쌓았습니다.

더 나은 방식으로 처리하는 방법에 대한 단서를 얻기 위해 사용자 측에서 필요한 코드가 없습니다! ;)

전학 할 클래스는 다음과 같습니다.

public class FileEventsRequest {

private File originalFile;

private int rowCount;

private String md5;

private String cobDate;

private File controlFile; }

2. 해결방안:

나는 당신이 최근에 묘사 한 것과 거의 동일한 작업을했습니다! 내가 사용한 파일을 다운로드하려면-

@PutMapping("/{originalFileName}")
public ResponseEntity<ImmutableDocument> send(@PathVariable String originalFileName, InputStream payload) {
    LOG.info("Receiving: {}", originalFileName);
    sendPayload(payload, originalFileName);
    return ResponseEntity.ok().build();
}

나는 일반적으로 바이트 배열로 메모리에서 1GB의 대용량 파일을 처리하는 것이 좋지 않기 때문에 InputStream을 선택했습니다. 잠재적으로 스택을 날려 버릴 수 있습니다!

해당 파일을 대상으로 보내는 경우-

@Autowired
private RestTemplate sendTemplate;

private ResponseEntity<Void> sendPayload(final InputStream payload, final String originalFileName) throws IOException {
// You can send any other bits of information you need on the headers too
        HttpHeaders headers = new HttpHeaders();
        headers.put("originalFileName", originalFileName);
        headers.setContentType(asMediaType(MimeType.valueOf({desired mimetype})));
        headers.setAccept(singletonList(APPLICATION_OCTET_STREAM));
        HttpEntity<Resource> requestEntity = new HttpEntity<>(new InputStreamResource(payload), headers);
        UriComponentsBuilder builder = fromUriString({someurl});
        UriComponents uriComponents = builder.build().encode();
        return sendTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, requestEntity, Void.class);
    }
}

또한 이진 InputStream을 보내기위한 메시지 변환기와 함께 ResTemplate에 대한 자체 구성 클래스를 사용했습니다.

@Configuration
public class RestClientConfiguration {

@Bean
public RestTemplate sendTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
    return new RestTemplateBuilder()
        .requestFactory(() -> clientHttpRequestFactory)
        .messageConverters(new ResourceHttpMessageConverter())
        .build();
}

}
65844387