Skip to content
Snippets Groups Projects
Commit 242c4d5f authored by Gwan Ju's avatar Gwan Ju
Browse files

feat: Add S3File entity and update FileController

parent 479b3eff
No related branches found
No related tags found
No related merge requests found
...@@ -7,10 +7,9 @@ import org.springframework.http.MediaType; ...@@ -7,10 +7,9 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import umc.spring.file.domain.S3FileDto;
import umc.spring.file.service.AmazonS3Service; import umc.spring.file.service.AmazonS3Service;
import umc.spring.file.service.S3Service;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.List; import java.util.List;
...@@ -23,12 +22,10 @@ public class FileController { ...@@ -23,12 +22,10 @@ public class FileController {
private final AmazonS3Service amazon3SService; private final AmazonS3Service amazon3SService;
@PostMapping("/uploads") @PostMapping("/uploads")
public ResponseEntity<Object> uploadFiles( public List<S3FileDto> uploadFiles(
@RequestParam(value = "uploadFilePath") String uploadFilePath, @RequestParam(value = "uploadFilePath") String uploadFilePath,
@RequestPart(value = "files") List<MultipartFile> multipartFiles) { @RequestPart(value = "files") List<MultipartFile> multipartFiles) {
return ResponseEntity return amazon3SService.uploadFiles(uploadFilePath, multipartFiles);
.status(HttpStatus.OK)
.body(amazon3SService.uploadFiles(uploadFilePath, multipartFiles));
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
......
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;
}
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> {
}
package umc.spring.file.service; //package umc.spring.file.service;
//
import com.amazonaws.AmazonServiceException; //import com.amazonaws.AmazonServiceException;
import com.amazonaws.HttpMethod; //import com.amazonaws.HttpMethod;
import com.amazonaws.services.s3.AmazonS3; //import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.CannedAccessControlList; //import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; //import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.ObjectMetadata; //import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest; //import com.amazonaws.services.s3.model.PutObjectRequest;
import lombok.RequiredArgsConstructor; //import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; //import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; //import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; //import org.springframework.web.multipart.MultipartFile;
//
import java.io.IOException; //import java.io.IOException;
import java.net.URL; //import java.net.URL;
import java.net.URLDecoder; //import java.net.URLDecoder;
import java.util.Date; //import java.util.Date;
//
/* S3Service.java */ ///* S3Service.java */
@Slf4j //@Slf4j
@RequiredArgsConstructor //@RequiredArgsConstructor
@Service //@Service
public class S3Service { //public class S3Service {
//
@Value("${cloud.aws.s3.bucket}") // @Value("${cloud.aws.s3.bucket}")
private String bucket; // private String bucket;
//
private final AmazonS3 amazonS3; // private final AmazonS3 amazonS3;
//
/* 1. 파일 업로드 */ // /* 1. 파일 업로드 */
public String upload(MultipartFile multipartFile, String s3FileName) throws IOException { // public String upload(MultipartFile multipartFile, String s3FileName) throws IOException {
// 메타데이터 생성 // // 메타데이터 생성
ObjectMetadata objMeta = new ObjectMetadata(); // ObjectMetadata objMeta = new ObjectMetadata();
objMeta.setContentLength(multipartFile.getInputStream().available()); // objMeta.setContentLength(multipartFile.getInputStream().available());
// putObject(버킷명, 파일명, 파일데이터, 메타데이터)로 S3에 객체 등록 // // putObject(버킷명, 파일명, 파일데이터, 메타데이터)로 S3에 객체 등록
amazonS3.putObject(new PutObjectRequest(bucket, s3FileName, multipartFile.getInputStream(), objMeta) // amazonS3.putObject(new PutObjectRequest(bucket, s3FileName, multipartFile.getInputStream(), objMeta)
.withCannedAcl(CannedAccessControlList.PublicRead)); // .withCannedAcl(CannedAccessControlList.PublicRead));
// 등록된 객체의 url 반환 (decoder: url 안의 한글 or 특수문자 깨짐 방지) // // 등록된 객체의 url 반환 (decoder: url 안의 한글 or 특수문자 깨짐 방지)
return URLDecoder.decode(amazonS3.getUrl(bucket, s3FileName).toString(), "utf-8"); // return URLDecoder.decode(amazonS3.getUrl(bucket, s3FileName).toString(), "utf-8");
} // }
//
/* 2. 파일 삭제 */ // /* 2. 파일 삭제 */
public void delete (String keyName) { // public void delete (String keyName) {
try { // try {
// deleteObject(버킷명, 키값)으로 객체 삭제 // // deleteObject(버킷명, 키값)으로 객체 삭제
amazonS3.deleteObject(bucket, keyName); // amazonS3.deleteObject(bucket, keyName);
} catch (AmazonServiceException e) { // } catch (AmazonServiceException e) {
log.error(e.toString()); // log.error(e.toString());
} // }
} // }
//
/* 3. 파일의 presigned URL 반환 */ // /* 3. 파일의 presigned URL 반환 */
public String getPresignedURL (String keyName) { // public String getPresignedURL (String keyName) {
String preSignedURL = ""; // String preSignedURL = "";
// presigned URL이 유효하게 동작할 만료기한 설정 (2분) // // presigned URL이 유효하게 동작할 만료기한 설정 (2분)
Date expiration = new Date(); // Date expiration = new Date();
Long expTimeMillis = expiration.getTime(); // Long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 2; // expTimeMillis += 1000 * 60 * 2;
expiration.setTime(expTimeMillis); // expiration.setTime(expTimeMillis);
//
try { // try {
// presigned URL 발급 // // presigned URL 발급
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucket, keyName) // GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucket, keyName)
.withMethod(HttpMethod.GET) // .withMethod(HttpMethod.GET)
.withExpiration(expiration); // .withExpiration(expiration);
URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest); // URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest);
preSignedURL = url.toString(); // preSignedURL = url.toString();
} catch (Exception e) { // } catch (Exception e) {
log.error(e.toString()); // log.error(e.toString());
} // }
//
return preSignedURL; // return preSignedURL;
} // }
} //}
\ No newline at end of file \ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment