diff --git a/src/main/java/umc/spring/file/controller/FileController.java b/src/main/java/umc/spring/file/controller/FileController.java index 677c28481dfd829084b2ea51b2d4bd68ea116edc..9eadce91f9ed2945b0b9c8905b3fb929f2445300 100644 --- a/src/main/java/umc/spring/file/controller/FileController.java +++ b/src/main/java/umc/spring/file/controller/FileController.java @@ -7,10 +7,9 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import umc.spring.file.domain.S3FileDto; import umc.spring.file.service.AmazonS3Service; -import umc.spring.file.service.S3Service; -import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; @@ -23,12 +22,10 @@ public class FileController { private final AmazonS3Service amazon3SService; @PostMapping("/uploads") - public ResponseEntity<Object> uploadFiles( + public List<S3FileDto> uploadFiles( @RequestParam(value = "uploadFilePath") String uploadFilePath, @RequestPart(value = "files") List<MultipartFile> multipartFiles) { - return ResponseEntity - .status(HttpStatus.OK) - .body(amazon3SService.uploadFiles(uploadFilePath, multipartFiles)); + return amazon3SService.uploadFiles(uploadFilePath, multipartFiles); } @DeleteMapping("/delete") diff --git a/src/main/java/umc/spring/file/domain/S3File.java b/src/main/java/umc/spring/file/domain/S3File.java new file mode 100644 index 0000000000000000000000000000000000000000..ec0eebd09e125a2f0fc95ef88da5bc44cec598e7 --- /dev/null +++ b/src/main/java/umc/spring/file/domain/S3File.java @@ -0,0 +1,26 @@ +package umc.spring.file.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import umc.spring.post.data.entity.Post; + +@Entity +@Getter +public class S3File { + + @Id @GeneratedValue + Long id; + + @ManyToOne + @JoinColumn(name = "project_id") + private Post post; + + private String originalFileName; + + private String uploadFileName; + + private String uploadFilePath; + + private String uploadFileUrl; +} diff --git a/src/main/java/umc/spring/file/repository/S3FileRepository.java b/src/main/java/umc/spring/file/repository/S3FileRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..34a341a86726cac2fa56ba31ada5f8be403233df --- /dev/null +++ b/src/main/java/umc/spring/file/repository/S3FileRepository.java @@ -0,0 +1,7 @@ +package umc.spring.file.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.file.domain.S3File; + +public interface S3FileRepository extends JpaRepository<S3File, Long> { +} diff --git a/src/main/java/umc/spring/file/service/S3Service.java b/src/main/java/umc/spring/file/service/S3Service.java index cce2f50900abfb34664e28e705dcc7040e117fb3..8502141dbd6df7089139c983ed160d395836063b 100644 --- a/src/main/java/umc/spring/file/service/S3Service.java +++ b/src/main/java/umc/spring/file/service/S3Service.java @@ -1,76 +1,76 @@ -package umc.spring.file.service; - -import com.amazonaws.AmazonServiceException; -import com.amazonaws.HttpMethod; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.PutObjectRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.net.URL; -import java.net.URLDecoder; -import java.util.Date; - -/* S3Service.java */ -@Slf4j -@RequiredArgsConstructor -@Service -public class S3Service { - - @Value("${cloud.aws.s3.bucket}") - private String bucket; - - private final AmazonS3 amazonS3; - - /* 1. 파일 업로드 */ - public String upload(MultipartFile multipartFile, String s3FileName) throws IOException { - // 메타데이터 생성 - ObjectMetadata objMeta = new ObjectMetadata(); - objMeta.setContentLength(multipartFile.getInputStream().available()); - // putObject(버킷명, 파일명, 파일데이터, 메타데이터)로 S3에 객체 등록 - amazonS3.putObject(new PutObjectRequest(bucket, s3FileName, multipartFile.getInputStream(), objMeta) - .withCannedAcl(CannedAccessControlList.PublicRead)); - // 등록된 객체의 url 반환 (decoder: url 안의 한글 or 특수문자 깨짐 방지) - return URLDecoder.decode(amazonS3.getUrl(bucket, s3FileName).toString(), "utf-8"); - } - - /* 2. 파일 삭제 */ - public void delete (String keyName) { - try { - // deleteObject(버킷명, 키값)으로 객체 삭제 - amazonS3.deleteObject(bucket, keyName); - } catch (AmazonServiceException e) { - log.error(e.toString()); - } - } - - /* 3. 파일의 presigned URL 반환 */ - public String getPresignedURL (String keyName) { - String preSignedURL = ""; - // presigned URL이 유효하게 동작할 만료기한 설정 (2분) - Date expiration = new Date(); - Long expTimeMillis = expiration.getTime(); - expTimeMillis += 1000 * 60 * 2; - expiration.setTime(expTimeMillis); - - try { - // presigned URL 발급 - GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucket, keyName) - .withMethod(HttpMethod.GET) - .withExpiration(expiration); - URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest); - preSignedURL = url.toString(); - } catch (Exception e) { - log.error(e.toString()); - } - - return preSignedURL; - } -} \ No newline at end of file +//package umc.spring.file.service; +// +//import com.amazonaws.AmazonServiceException; +//import com.amazonaws.HttpMethod; +//import com.amazonaws.services.s3.AmazonS3; +//import com.amazonaws.services.s3.model.CannedAccessControlList; +//import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; +//import com.amazonaws.services.s3.model.ObjectMetadata; +//import com.amazonaws.services.s3.model.PutObjectRequest; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Service; +//import org.springframework.web.multipart.MultipartFile; +// +//import java.io.IOException; +//import java.net.URL; +//import java.net.URLDecoder; +//import java.util.Date; +// +///* S3Service.java */ +//@Slf4j +//@RequiredArgsConstructor +//@Service +//public class S3Service { +// +// @Value("${cloud.aws.s3.bucket}") +// private String bucket; +// +// private final AmazonS3 amazonS3; +// +// /* 1. 파일 업로드 */ +// public String upload(MultipartFile multipartFile, String s3FileName) throws IOException { +// // 메타데이터 생성 +// ObjectMetadata objMeta = new ObjectMetadata(); +// objMeta.setContentLength(multipartFile.getInputStream().available()); +// // putObject(버킷명, 파일명, 파일데이터, 메타데이터)로 S3에 객체 등록 +// amazonS3.putObject(new PutObjectRequest(bucket, s3FileName, multipartFile.getInputStream(), objMeta) +// .withCannedAcl(CannedAccessControlList.PublicRead)); +// // 등록된 객체의 url 반환 (decoder: url 안의 한글 or 특수문자 깨짐 방지) +// return URLDecoder.decode(amazonS3.getUrl(bucket, s3FileName).toString(), "utf-8"); +// } +// +// /* 2. 파일 삭제 */ +// public void delete (String keyName) { +// try { +// // deleteObject(버킷명, 키값)으로 객체 삭제 +// amazonS3.deleteObject(bucket, keyName); +// } catch (AmazonServiceException e) { +// log.error(e.toString()); +// } +// } +// +// /* 3. 파일의 presigned URL 반환 */ +// public String getPresignedURL (String keyName) { +// String preSignedURL = ""; +// // presigned URL이 유효하게 동작할 만료기한 설정 (2분) +// Date expiration = new Date(); +// Long expTimeMillis = expiration.getTime(); +// expTimeMillis += 1000 * 60 * 2; +// expiration.setTime(expTimeMillis); +// +// try { +// // presigned URL 발급 +// GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucket, keyName) +// .withMethod(HttpMethod.GET) +// .withExpiration(expiration); +// URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest); +// preSignedURL = url.toString(); +// } catch (Exception e) { +// log.error(e.toString()); +// } +// +// return preSignedURL; +// } +//} \ No newline at end of file