[AWS] S3 업로드

백현균·2023년 3월 26일
0

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;
}

주요 함수 설명

ObjectMetadata

 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);

코드 작성 참고 링크

업로드 기능 고도화 기능 링크

0개의 댓글