S3 클라이언트 객체 생성
public AmazonS3 build(){
// 클라이언트 생성을 위한 빌더 객체 생성
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard()
.withRegion(Regions.DEFAULT_REGION);
// AWS에서 부여받은 액세스, 시크릿키 정보를 이용하여 인증 객체 생성
AWSStaticCredentialsProvider provider =
AwsCredentials.AwsCredentialProvider();
// 클라이언트 생성
AmazonS3 client = builder.withCredentials(provider).build();
return client;
}
업로드
public void upload(MultiPartFile file){
AmazonS3 client = new AmazonS3Client().build();
try{
// S3 업로드용 파일 이름 생성
String uploadFileName = getFileName(file.getOriginalFilename());
// S3 업로드 요청 정보 생성 후 업로드 진행
client.putObject(setPutObjectRequest(file, uploadFileName)
.withCannedAcl(CannedAccessControlList.PublicRead));
}
catch(AmazonServiceException ase) {
logger.error(ase.getMessage());
}
catch(SdkClientException se) {
logger.error(se.getMessage());
}
catch(Exception e){
logger.error(e.getMessage());
}
}
// 입력받은 파일 형태를 입력받아서, S3업로드용 객체로 변환
private static PutObjectRequest setPutObjectRequest(MultipartFile file, String fileName){
// S3 업로드를 위한 메타데이터 생성
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(file.getContentType());
// 입력받은 파일 객체를 stream형태로 취득
try(InputStream stream = file.getInputStream()){
// S3요청 정보 생성 및 반환
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUKET_NAME, fileName, stream, metadata);
return putObjectRequest;
}
catch(IOException ioe){
logger.error(ioe.getMessage());
}
return null;
}
private static String getFileName(String originFileName){
int extensionIndex = originFileName.lastIndexOf(FILE_EXTENSION_SEPARATOR);
String fileExtenSion = originFileName.substring(extensionIndex);
String fileName = originFileName.substring(0, extensionIndex);
String now = String.valueOf(System.currentTimeMillis());
String uploadFileName = String.format("%ss_%s.%s", fileName, now, fileExtenSion);
return uploadFileName;
}
주요 함수 설명
S3업로드를 위한 메타 데이터 값 설정을 하는 함수이며, S3업로드 함수는 파일의 바이트 데이터만 전달하기 때문에,
파일의 정보가 없기 때문에, ObjectMetadata객체로 정보 데이터를 생성하여 전달하여야 한다.
ex) metadata.setContentType(file.getContentType());
PutObjectRequest
1) 입력받은 파일을 S3업로드 요청 정보 생성 클래스로, 파일의 메타 정보,
업로드할 장소와 파일의 바이너리 데이터 등을 이용하여 실제 업로드 요청을 위한 준비를 한다.
2) 매개변수
- 버킷이름
- 업로드될 파일 이름
- 파일의 스트림 데이터
- 메타 데이터
3) ex) new PutObjectRequest("TEST_BUKET", file.stream(), meta);
putObject
1) 생성된 PutObjectRequest클래스를 실제 S3의 버킷에 파일을 업로드하는 함수로,
S3 클라이언트를 이용해, 업로드를 진행 시킨다.
2) 매개변수
- 업로드할 데이터의 Request정보
ex) s3Client.putObject(putObjectRequest);
코드 작성 참고 링크
업로드 기능 고도화 기능 링크