시작하기 앞서
업무를 하면서 이미지를 다운로드 할 수 있는 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