본문으로 바로가기

AWS S3에서 파일 다운로드 받기

category 프론트엔드/Ajax 2020. 7. 29. 11:35

회사에서 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

 

Download PDF from Byte array using ajax

I am trying below code but this is creating file but not showing content. I need your anyone help, What i am doing wrong. $.ajax({ type: "POST", async : false, url: "/searchModel/

stackoverflow.com

검색을 해보니 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은 다운로드 받을 때의 보여줄 파일 이름을 넣는다.