Skip to content

S3 storage에 파일을 저장, 조회, 삭제를 구현하는 API

Notifications You must be signed in to change notification settings

Yangdaehan/S3_storage

Repository files navigation

S3_storage

AWS S3 storage을 관리하는 API 입니다.

 

📋 구현 기능 명세

파일 저장, 조회, 삭제 하는 API를 구현했습니다.

  • [POST] 파일 업로드 API -> uploadFiles
  • [GET] 파일 다운로드 API -> downloadFile
  • [GET] 바이너리 파일 다운로드 API -> downloadBinaryFile
  • [GET] 파일 및 멤버 조회 API -> list
  • [DELETE] 파일 삭제 API -> deleteFile
  • [DELETE] 폴더 삭제 API -> deleteFolder

API 명세서

 

📢 기능 상세 설명

💡 S3 데이터 모델은 폴더 구조를 가지지 않고, 접두사를 통해 계층구조를 표현합니다. 하지만 우리가 AWS S3 페이지에서 보는 콘솔에서는 마치 폴더 구조를 가진 것 처럼 보여줍니다. 그래서 폴더라고 생각하고 구현했습니다.

 

1. 파일 업로드 API 구현

memberId를 제공받아 memberId 폴더를 만들도록 구현했습니다. 그리고 하위 폴더 이름이 제공될 경우, 하위 폴더를 만들어 파일을 하위 폴더에 업로드 할 수 있게 구현했습니다.

@PostMapping(value = "/uploadFiles", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<List<String>> uploadFiles(
@RequestPart("memberRequest") @Valid MemberRequest memberRequest,
@RequestPart("file") List<MultipartFile> files,
//하위 폴더가 제공될 경우 하위 폴더에 파일을 업로드
@RequestPart(value = "subfolderRequest", required = false) SubfolderRequest subfolderRequest
) {

2. 파일 다운로드 API 구현

파일을 다운로드 하는 방식을 두가지를 구현했습니다.

첫번째로 일반 파일을 url 형식으로 전송받아서 저장가능하게끔 구현했습니다. 예시는 아래와 같습니다. image

두번째로는 바이너리 형식으로 받게끔 구현했습니다. 따라서 이미지 파일 같은 경우 바로 나타나집니다. image

3. 파일 및 멤버 조회 API 구현

memberId와 하위 폴더 모두 required를 false로 설정하여 받아졌을때만 해당 기능을 구현하게끔 설정했습니다.

@GetMapping("/list")
public ResponseEntity<List<String>> listFiles(
@RequestPart(value = "memberRequest", required = false) MemberRequest memberRequest,
@RequestPart(value = "subfolderRequest", required = false) SubfolderRequest subfolderRequest

4. 삭제 API 구현

삭제를 두가지 방식으로 구현했습니다. 첫번재는 특정 파일만 삭제하게 구현했습니다.

@DeleteMapping("/deleteFile")
public ResponseEntity<String> deleteFile(
@RequestPart("memberRequest") MemberRequest memberRequest,
@RequestPart(value = "subfolderRequest", required = false) SubfolderRequest subfolderRequest,
@RequestPart("fileName") String fileName
파일 이름을 제공받아 삭제를 할 수 있게 구현했습니다.

두번째로는 폴더를 모두 삭제하는 기능입니다. 회문을 돌려 모든 파일이 삭제되게 구현했습니다.

private void deleteObjectsRecursively(String prefix) {
ListObjectsV2Request listObjectsRequest = new ListObjectsV2Request()
.withBucketName(bucket)
.withPrefix(prefix);
ListObjectsV2Result result;
do {
result = amazonS3Client.listObjectsV2(listObjectsRequest);
for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
amazonS3Client.deleteObject(new DeleteObjectRequest(bucket, objectSummary.getKey()));
}
listObjectsRequest.setContinuationToken(result.getNextContinuationToken());
} while (result.isTruncated());
}

About

S3 storage에 파일을 저장, 조회, 삭제를 구현하는 API

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published