/**
* S3에서 파일을 다운로드한다.
* fileName : 파일의 경로 / 이름
*/
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile(@RequestParam String fileName) throws IOException {
log.info("fileName = {}", fileName);
return s3Service.getObject(fileName);
}
public ResponseEntity<byte[]> getObject(String storedFileName) throws IOException {
S3Object o = amazonS3Client.getObject(new GetObjectRequest(bucket, storedFileName));
S3ObjectInputStream objectInputStream = o.getObjectContent();
byte[] bytes = IOUtils.toByteArray(objectInputStream);
String fileName = URLEncoder.encode(storedFileName, "UTF-8").replaceAll("\\+", "%20");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.TEXT_PLAIN);
httpHeaders.setContentLength(bytes.length);
httpHeaders.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
}
헤더의 MediaType은 파일 종류에 맞게 설정해준다.
이미지의 경우 httpHeaders.setContentType();
등으로 설정해주면 된다.
처음에 다음과 같이 조회하니 에러가 발생했다.
“The specified key does not exist.” 오류는 s3 버킷 내에 해당 object가 존재하지 않아 생기는 오류이다.
나의 경우는 폴더 경로를 입력해주지 않아 발생했다.
업로드가 되지 않은 경우 / 폴더 경로를 입력해주지 않은 경우 / 파일명이 잘못된 경우 등을 고려하자
요청 파일명을 변경하니 잘 다운로드되었다.