Search

RestTemplate에서 받아온 이미지 파일 다운로드하기

 시작하기 앞서

업무를 하면서 이미지를 다운로드 할 수 있는 URL을 통해 내려받을 일이 있었다. 어떻게 응답 데이터를 설정해야 할지부터 여러 고민이 있었다. 궁극적으로 이미지를 MultipartFile 객체로 변환해야 한다. 이미지를 업로드 하는 공통 로직은 MultipartFile 객체만 주입받을 수 있기 때문이다. 이번 글은 각 과정에서 어떻게 해결해갔는지 기록해두려고 한다.

 이미지 → MultipartFile 객체로 변환하기

 HTTP Request

먼저 요청할 수 있도록 아래와 같이 RestTemplate를 준비했다. 별다른 설정없이 ConnectionTimeout과 ReadTimeout을 각각 2초로 설정해줬다.
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setConnectTimeout(2000); factory.setReadTimeout(2000); this.restTemplate = new RestTemplate(factory);
Java

 byte[] to MultiPartFile

응답 데이터를 byte[]로 내려받고, MultiPartFile 객체로 변환해줬다. 인자로는 URL과 응답 데이터의 타입을 주입해주면 된다.
byte[] bytes = this.restTemplate.getForObject(URL, byte[].class);
Java
만약에 응답 받은 byte[] 데이터를 원하는 경로에 파일로 저장하고 싶다면 아래와 같이 코드를 추가하면 된다.
Files.write(Paths.get("test.jpg"), bytes);
Java
본격적으로 byte[] → MultipartFile로 변환해보려고 한다. 먼저 알아야 할 점은 MultipartFile은 인터페이스이다. 즉 인터페이스에서 제공하는 메서드를 구현해야 한다.
public class ImageMultipartFile implements MultipartFile { private final byte[] imageContent; private final String name; private final String originalFileName; private final String contentType; public ImageMultipartFile(String name, byte[] imageContent, String originalFileName, String contentType) { this.name = name; this.imageContent = imageContent; this.originalFileName = originalFileName; this.contentType = contentType; } @Override public String getName() { return name; } @Override public String getOriginalFilename() { return originalFileName; } @Override public String getContentType() { return contentType; } @Override public boolean isEmpty() { return imageContent == null || imageContent.length == 0; } @Override public long getSize() { return imageContent.length; } @Override public byte[] getBytes() throws IOException { return imageContent; } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(imageContent); } @Override public void transferTo(File dest) throws IOException, IllegalStateException { new FileOutputStream(dest).write(imageContent); } }
Java

 참고 자료