올린다 올린다 했는데 거의 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 확장 프로그램들은 있으니 그거 사용하시는거 추천 합니다.
급하게 뭐라도 부여 잡고 싶은 초보분들은 흐름에 참고가 되었으면 합니다
Javascript json 파싱된 배열 내에서 indexOf로 특정키에 해당하는 값이 있는지 확인 (0) | 2017.03.08 |
---|---|
[IOS/Swift] 연습 기록 (0) | 2015.06.03 |
[IOS/Swift] 공부 중 따라 친 예제 기록 01 (0) | 2015.06.03 |