AWS S3 4 - S3 오브젝트 다운로드

조윤호·2023년 3월 6일
0

AWS S3

목록 보기
4/4
post-thumbnail

Controller

/**
 * S3에서 파일을 다운로드한다.
 * fileName : 파일의 경로 / 이름
 */
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile(@RequestParam String fileName) throws IOException {
    log.info("fileName = {}", fileName);
    return s3Service.getObject(fileName);
}

S3 Storage

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(); 등으로 설정해주면 된다.

기타 AmazonS3Client의 read 관련 메소드

🛠에러 로그

처음에 다음과 같이 조회하니 에러가 발생했다.

“The specified key does not exist.” 오류는 s3 버킷 내에 해당 object가 존재하지 않아 생기는 오류이다.

나의 경우는 폴더 경로를 입력해주지 않아 발생했다.

업로드가 되지 않은 경우 / 폴더 경로를 입력해주지 않은 경우 / 파일명이 잘못된 경우 등을 고려하자

요청 파일명을 변경하니 잘 다운로드되었다.

전체 코드

spring-s3-practice 깃허브

전체 코드

spring-s3-practice 깃허브

📚참고문헌

profile
한걸음씩 성실히

0개의 댓글