WebClient로 서버1에서 영상을 넘겨주고 서버2에서 영상 메타데이터를 서버1로 전송하는 코드를 작성해보겠습니다.
implementation 'org.springframework.boot:spring-boot-starter-webflux'
WebClient를 사용하기 위해 build.gradle에 spring-boot-starter-webflux 추가해주세요.
@Data
public class Metadata {
public String file_path;
public String filename;
public String ext;
public int width;
public int height;
public String format_name;
public String format_long_name;
public String tags;
public double duration;
public Long size;
}
public class UploadFileToServer {
@Value("http://localhost:8081")
private String serverUrl;
public WebClient webClient() {
return WebClient
.builder()
.baseUrl(serverUrl)
.build();
}
public Mono<Metadata> upload(Resource files) {
return webClient()
.method(HttpMethod.POST)
.uri("/s2/api/metadataFetcher")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.romResource(files))
.retrieve()
.bodyToMono(Metadata.class);
}
}
메타데이터 클래스 작성하기 (서버1의 메타데이터와 동일)
메타데이터 가져오는 api 만들기
@RestController
@RequiredArgsConstructor
public class MetadataController {
private final VideoFileUtils videoFileUtils;
@PostMapping(value = "/s2/api/metadataFetcher")
public ResponseEntity<Metadata> upload(
@RequestParam(value = "files", required = false)MultipartFile files) {
Metadata metadata = mediaDataFetcher.getMediaInfo(videoFileUtils.ffprobe, filePath);
return ResponseEntity.ok().body(metadata);
}
}
@Service
public class MediaDataFetcher {
public Metadata getMediaInfo(FFprobe ffprobe, String filePath) throws IOException {
System.out.println("파일 : " + filePath);
FFmpegProbeResult probeResult = ffprobe.probe(filePath);
Metadata metadata = new Metadata();
metadata.width = probeResult.getStreams().get(0).width;
metadata.height = probeResult.getStreams().get(0).height;
metadata.format_name = probeResult.getFormat().format_name;
metadata.format_long_name = probeResult.getFormat().format_long_name;
metadata.tags = probeResult.getFormat().tags.toString();
metadata.duration = probeResult.getFormat().duration;
metadata.size = probeResult.getFormat().size;
return metadata;
}
}
@RestController
@RequiredArgsConstructor
public class UploadController {
private final UploadFileToServer uploadFileToServer;
@PostMapping(value = "/s1/api/upload")
public void upload(){
uploadFileToServer
.upload(mediaFiles)
.subscribe(System.out::println);
}
}
그럼 서버2에서 추출한 메타데이터가 서버1로 전송되면서 출력됩니다.