회사에서 AWS S3에 파일 관리를 하고 있다.
특정 배너의 자료받기 버튼을 클릭하면 pdf 문서를 다운받을 수 있는 기능을 추가하는 작업을 받았다.
AWS S3 다운로드 받기 위해서는 버킷이름, 키 이름이 파라미터로 필요!
예를 들어 s3.aws.com/download?key=doc/guide.pdf 이런 식으로 request url과 쿼리 스트링을 날리면
버킷 이름은 : s3.aws.com 키 이름으로는 파일 경로/파일 형식으로 전달 한다 (경로가 제대로 전달되지 않으면 에러 뜸!!)
처음에는 ajax로 request 요청을 했는데 잘 되지 않았다.
https://stackoverflow.com/questions/33174880/download-pdf-from-byte-array-using-ajax
검색을 해보니 ajax로 다운로드는 불가능하고 a 태그 방식으로 요청을 보내야 된다
요청받은 자바쪽 코드를 살펴보자
S3ObjectInputStream objectInputStream = s3Object.getObjectContent();
byte[] bytes = IOUtils.toByteArray(objectInputStream);
InputStream을 받고 IOUtils.toByteArray(objectInputStream); 이 실행되면 toByteArray 메소드에 의해 파일을 만들고 내용을 쓰는 과정을 거친다.
toByteArray 메소드 안을 뜯어보면 ByteArrayOutputStream output을 통해 write를 하고 결과물을 byteArray로 리턴한다.
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
httpHeaders.setContentDispositionFormData("attachment", fileName);
전송하는 파일의 종류에 따라 Content-Type을 지정해준다. 이미지는 "image/jpeg" 같은 형식으로,
기타 파일은 "application/octet-stream"를 넣어준다.
setContentDispositionFormData은 다운로드 받을 때의 보여줄 파일 이름을 넣는다.