Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Spring/HTTP] RestTemplate으로 파일 업로드 (특히, byte 배열 데이터) Computer & Program

org.springframework.web.client.RestTemplate을 이용해서 파일을 업로드하는 방법은 많다. 여기서는 FormHttpMessageConverter의 클래스 설명에 있는 것처럼 MultiValueMap을 사용해 봤다.

MultiValueMap <String, Object> parts = new LinkedMultiValueMap<String, Object> ();
parts.add("key", "value");
parts.add("file", new org.springframework.core.io.ClassPathResource("myFile.jpg"));
// 또는
// parts.add("file", new org.springframework.core.io.FileSystemResource("myFile.jpg"));
// parts.add("file", new org.springframework.core.io.UrlResource("http://another.com/myFile.jpg"));

RestTemplate restTemplate = new RestTemplate();
template.postForEntity("http://example.com/myFileUpload", parts);

간단하게 이미지와 같은 파일을 업로드할 수 있다. (다운로드는 요게서..)


그런데 위의 예제에서 사용한 ClassPathResource, FileSystemResource, UrlResource 등은 이미 파일이 어딘가에 저장되어 있는 경우에만 사용할 수 있다. 만일 파일이 실제로 존재하지 않고, 파일의 내용만을 가지고 있다면?? 예를 들어, A라는 사이트에서 이미지를 받아서 (로컬에 저장하지 않고) B로 업로드 해야 하는 경우가 있다. 파일을 생성할 필요도 없고 단순히 파일 내용만 전송해주면 되는 것이다. 읽어온 파일은 byte 배열이다.

byte [] imageBytes = ...; // 어딘가에서 읽어온 파일 내용
MultiValueMap <String, Object> parts = new LinkedMultiValueMap<String, Object> ();
parts.add("key", "value");
parts.add("file", new org.springframework.core.io.ByteArrayResource("myFile.jpg") {
    @Override
    public String getFilename() throws IllegalStateException {
        return "myFile.jpg";
    }
});

RestTemplate restTemplate = new RestTemplate();
template.postForEntity("http://example.com/myFileUpload", parts);

다행히도 ByteArrayResource라는 녀석이 있어서 byte 배열을 다른 리소스처럼 사용할 수 있다. 하지만, 위에서 재정의(override)한 getFilename() 메소드를 재정의해주지 않으면 IllegalStateException이 발생한다. 파일 업로드를 하려면 원본 파일의 이름을 참조하기 때문에 이 때 getFilename() 메소드를 호출하게 되고, byte 배열로 내용만 가지고 있는 리소스는 이름이 없기 때문이다.



- 참고

Handling multipart form data in Spring 3.1
Sending Multipart File as POST parameters with RestTemplate requests
[Spring/HTTP] RestTemplate으로 이미지 다운로드

핑백

덧글

댓글 입력 영역

Google AdSense (text/image)