상세 컨텐츠

본문 제목

AWS S3 업로더 개발 하기 2부

개발

by 동동주1123 2016. 5. 8. 15:34

본문


올린다 올린다 했는데 거의 2년만에 올립니다.


요즘은 AWS 책들 많이 나온것 같더군요.

책을 구입해 보시는게 제일 좋을건데 제가 했던당시 흐름 참고만 하라고 올려 드립니다.


소스는 필요 없는 부분들은 지워서 올릴거라 

돌려봐야 안돌아 갈것 같습니다.


거의 2년전이라 AWS자체가 변했을 수도 있습니다.


1. 연결하기


public class S3UploadConnect {


private final boolean IS_PROXY = flase;


// 프로퍼티에 지정된 값들

@Value("${proxy.ip}")

private String proxyIp;


@Value("${proxy.port}")

private int proxyPort;

@Value("${accessKey}")

private String accessKey;


@Value("${secretKey}")

private String secretKey;


public AmazonS3Client S3Connection() {

AmazonS3Client client;

if (IS_PROXY == true) {

// Proxy를 거쳐야 할경우

BasicAWSCredentials basicCred = new BasicAWSCredentials(accessKey, secretKey);

ClientConfiguration clientCfg = new ClientConfiguration();

clientCfg.setProtocol(Protocol.HTTP);

clientCfg.setProxyHost(proxyIp);

clientCfg.setProxyPort(proxyPort);

s3Client = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider(), clientCfg);

}else{

// Proxy 사용 안한경우

s3Client = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());

}

return client;

}


}


2. 컨트롤러


@Controller

public class S3Controller {

/**

* Service

*/

@Autowired

private S3Service s3Service;

/**

* 이미지 업로드

*/

@RequestMapping(value = "/uploadImage.do", method = RequestMethod.POST)

public @ResponseBody String uploadImageS3(@ModelAttribute("uploadForm") FileFormModel uploadForm,

HttpServletRequest request) throws Exception {

String result= "";

result= s3Service.makeFile(uploadForm );

return result;

}

}


3. 서비스


@Service

public class S3Service {


@Value("${buckketname}")

private String bucketName;

@Value("${bucketmaxsize}")

private int allowMaxSize;

@Autowired

private S3UploadConnect s3Connect;

 

private AmazonS3Client s3Client;

private void s3Connect() {

this.s3Client = s3Connect.S3Connection();

}

// 허용 확장자

private final String[] FILE_EXT = { "jpg", "xxx ... "};

private final String UPSUCC = "Y";

/**

* 이미지 업로드

*/

public String makeFile(FileformModel form) throws IOException {

List<MultipartFile> files = form.getFiles();

String keyPrefix = (StringUtils.isEmpty(form.getCurrentDir())) ? "" : removeSlash(form.getCurrentDir(),"/") ;

// S3 연결

s3Connect();

if (null != files && files.size() > 0) {

for (MultipartFile multipartFile : files) {

checkFileConstrains(multipartFile);

ObjectMetadata metadata = getObjectMetadata(multipartFile);

InputStream inputStream = multipartFile.getInputStream();

String originFileName = multipartFile.getOriginalFilename();


String savedObjectKey = (StringUtils.isEmpty(keyPrefix)) ? originFileName : keyPrefix+"/"+originFileName;

try {

PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, savedObjectKey, inputStream, metadata);

// 권한 : public

putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);

s3Client.putObject(putObjectRequest);

}catch(AmazonServiceException ase) {

           logger.info("예외발생    " + ase.getMessage());

} catch (AmazonClientException ace) {

logger.info("예외발생 " + ace.getMessage());

}

inputStream.close();

}

}

return UPSUCC;

}

/**

* Expire date 세팅

*/

private Date urlAccessExpireDate() {

Date expiration = new java.util.Date();

long milliSeconds = expiration.getTime();

milliSeconds += 3600000; 

expiration.setTime(milliSeconds);

return expiration;

}

/**

* 메타 정보

*/

private ObjectMetadata getObjectMetadata(MultipartFile multipartFile)

throws IOException {

ObjectMetadata metadata = new ObjectMetadata();

Long contentLength = Long.valueOf(IOUtils.toByteArray(multipartFile.getInputStream()).length);

metadata.setContentType(multipartFile.getContentType());

metadata.setContentLength(contentLength);

return metadata;

}

/**

* 슬레시 제거

*/

public String removeSlash(String reqString , String delimiter) {

for(int i = reqString.length()-1; i >= 0 ; i-- ) {

if(reqString.endsWith(delimiter)) {

reqString = StringUtils.left(reqString , i);

}

else{break;}

}

return reqString;

}

/**

* 파일명 확인

*/

private void checkFileConstrains(MultipartFile multiPartFile){

// 전달 받은 파일명으로 허용된 확장자인지 확인

}


/**

* 사이즈 확인

*/

private boolean checkFileSize(long size) {

// 전달받은 사이즈가 허용된 MAX 값을 초과 하는지 확인

}



}





4. FileFormModel

public class FileFormModel{

 

private List<MultipartFile> files;

private String currentDir;

public List<MultipartFile> getFiles() {

return files;

}

public void setFiles(List<MultipartFile> files) {

this.files = files;

}


public String getCurrentDir() {

return currentDir;

}


public void setCurrentDir(String currentDir) {

this.currentDir = currentDir;

}

 

 

}




다시 한번 말씀 드리지만 2년전에는 대충 요정도 하면 업로드는 됐었구나 하고 작은 구멍 하나뚫는 참고용으로만 

보세요. 


그리고 크롬에 왠만한 S3 확장 프로그램들은 있으니 그거 사용하시는거 추천 합니다.

급하게 뭐라도 부여 잡고 싶은 초보분들은 흐름에 참고가 되었으면 합니다


관련글 더보기