diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" new file mode 100644 index 0000000..0e96e5e --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -0,0 +1,58 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + ObjectListing objectListing = amazonS3.listObjects(bucketName); + List s3objects = objectListing.getObjectSummaries(); + + List imagesURL = new ArrayList<>(); + + for(S3ObjectSummary ob : s3objects){ + String objectKey = ob.getKey(); + imagesURL.add(amazonS3.getUrl(bucketName, objectKey).toString()); + } + + model.addAttribute("fileUrls", imagesURL); + + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + + //s3에 파일 업로드 + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + //업로드한 객체 ACL 설정 + amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); + + return "redirect:/"; + } +} diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..1604dd8 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,23 @@ +## 📌 5주차 Server session 기본 과제 +- S3에 객체 업로드가 가능한 `@PostMapping` 구현하기 +- S3 객체 조회가 가능한 `@GetMapping` 구현하기 + +

+ +## ❓ 해결과정 + +### 1. 사진 리스트 가져오기 +1. AmazonS3를 사용하여 S3 버킷의 객체 목록을 가져오는 ObjectListing 객체 생성하기 +2. ObjectListing에서 가져온 객체 목록을 S3ObjectSummary 리스트로 저장하기 +3. URL을 저장할 문자열 리스트 imagesURL 생성 +4. for문을 이용해 객체 목록에서 각 객체의 정보를 가져오기 +5. 객체의 key값을 이용해 객체의 url 가져와서 imagesURL 리스트에 추가 +

+ +### 2️. 사진 업로드하기 +1. S3에 파일 업로드하기 +2. ACL객체 권한을 Public read로 설정하 +

+ +## ❗ 과제 인증 +https://drive.google.com/file/d/1cXQHfDU7yk9nmS88daIkPFKEamGRDNeG/view?usp=sharing