728x90
MultipartFile 다중 파일 업로드 받아 API에 전달하는 컨트롤러 구현
public static final String API_URL = "여기에 api url 입력";
@PostMapping("/multipart/fileupload")
@ResponseBody
public ResponseEntity<?> uploadAudioFile(
@RequestParam("file") List<MultipartFile> files, // 업로드할 파일 리스트
@RequestParam("userid") String userId, // 사용자 ID
@RequestParam("authkey") String authKey) { // 인증 키
try {
// 파일 데이터를 포함한 멀티파트 요청 데이터를 생성
MultiValueMap<String, Object> body = getMultiAudioMap(files);
// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 요청 Content-Type 설정
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); // JSON 응답을 기대
// HTTP 엔티티 생성 (본문 + 헤더)
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
// RestTemplate을 사용해 외부 API 호출
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForEntity(WHISPER_FILE_UPLOAD_API, requestEntity, String.class);
} catch (IOException e) {
// 파일 데이터 처리 중 IOException 발생 시
e.printStackTrace();
return ResponseEntity.status(400).body("Invalid file data: " + e.getMessage());
} catch (Exception e) {
// API 호출 중 기타 예외 발생 시
e.printStackTrace();
return ResponseEntity.status(500).body("File upload Api Response error : " + e.getMessage());
}
}
private MultiValueMap<String, Object> getMultiAudioMap(List<MultipartFile> files) throws IOException {
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); // 멀티파트 요청 데이터를 저장할 맵 생성
for (MultipartFile file : files) {
// 업로드된 파일 데이터를 ByteArrayResource로 변환
ByteArrayResource fileResource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
// 파일명 반환 (파일명이 null일 경우 "unknown" 반환)
return file.getOriginalFilename() != null ? file.getOriginalFilename() : "unknown";
}
};
// 개별 파일에 대한 HTTP 헤더 설정
HttpHeaders fileHeaders = new HttpHeaders();
fileHeaders.setContentType(MediaType.parseMediaType(file.getContentType())); // 파일의 Content-Type 설정
// 파일 데이터를 포함하는 HTTP 엔티티 생성
HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(fileResource, fileHeaders);
// 'file' 키에 파일 데이터를 추가
map.add("file", fileEntity);
}
return map; // 멀티파트 데이터 반환
}
- uploadAudioFile :
- HTTP 요청으로 전송된 audio 다중 파일(MultipartFile)을 외부 API에 전달합니다.
- MultiValueMap이를 활용하여 멀티파트 데이터 형식을 외부 API에 전송합니다.
- getMultiAudioMap :
- 수신된 파일을 ByteArrayResource변환하여 MultiValueMap에 담습니다.
- 각 파일에 적절한 ContentType( audio/wav)를 설정합니다.
- 파일 이름 file.getOriginalFilename()을 사용합니다.
728x90
'STUDY > SpringLegacy' 카테고리의 다른 글
[Spring] maven grpc client 구현을 위한 pom.xml 작성 (0) | 2024.11.19 |
---|---|
[Spring] Interceptor 인터셉터 (0) | 2024.11.09 |
[STS] Spring MVC Project 템플릿 없음 해결방법 (0) | 2024.10.11 |
[Spring] Spring에서 클라이언트로부터 파라미터를 받는 방법과 Content-Type 설정 (0) | 2024.07.30 |
[Spring] @Autowired null 문제 해결 (필드 주입 사용 시) (0) | 2024.06.10 |