publicstatic String imageBoardUpload(MultipartFile attach, String savedFileName){ AmazonS3 amazonS3; //인스턴스를 초기화 시킨다. // 인증 객체를 생성한다. AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY); amazonS3 = new AmazonS3Client(awsCredentials); // 파일 metadata 설정 ObjectMetadata omd = new ObjectMetadata(); omd.setContentType(attach.getContentType()); omd.setContentLength(attach.getSize()); // 실제 업로드 기능을 수행 PutObjectRequest putObjectRequest; try { putObjectRequest = new PutObjectRequest(BUCKET_NAME, savedFileName, attach.getInputStream(), omd); amazonS3.putObject(putObjectRequest); } catch (IOException e) { e.printStackTrace(); return"fail"; } return"success"; }
attach로 s3에 올릴 이미지 파일을 받아오고, savedFileName으로 s3에 저장될 파일이름을 받아온다. return을 String으로 받은 이유는 controller에서 s3에 업로드가 성공이면 DB에등록이되고, 실패면 DB에 등록이 되지 않도록 하기 위해서이다.
putObjectRequest = new PutObjectRequest(BUCKET_NAME, savedFileName, attach.getInputStream(), omd);
publicstatic ResponseEntity<byte[]> imageDownload(String key, String fileName) throws IOException { AmazonS3 amazonS3; //인스턴스를 초기화 시킨다. // 인증 객체를 생성한다. AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY); amazonS3 = new AmazonS3Client(awsCredentials); // 실제 다운로드 기능을 수행 GetObjectRequest getObjectRequest; getObjectRequest = new GetObjectRequest(BUCKET_NAME, key); S3Object o = amazonS3.getObject(getObjectRequest); S3ObjectInputStream objectInputStream = o.getObjectContent(); byte[] bytes = IOUtils.toByteArray(objectInputStream); // HTTP 응답 헤더 정보를 유지하는 HttpHeaders 오브젝트 // ResponseEntity 오브젝트를 사용함으로 개별적 헤더를 설정 할 수 있다. HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.parseMediaTypes(o.getObjectMetadata().getContentType()).get(0)); httpHeaders.setContentLength(bytes.length); httpHeaders.setContentDispositionFormData("attachment", fileName); returnnew ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK); }
key로 S3에 저장되어 있는 파일 이름을 받아오고, fileName으로 다운로드 받을 때 저장될 이름을 받아온다.
ResponseEntity<>
독립적인 RestFul API를 개발하기 위해 , 상태코드, HttpHeader, 응답메시지, 반환 데이터를 모두 지정해서 반환해주기 위해 사용한다. 서버에서는 Client에서 데이터를 어떻게 출력하는 방식에 대해 관심을 갖지 않고 오직 리소스를 전달해주는 것에만 관심이 있다.