강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

sy k님의 프로필 이미지
sy k

작성한 질문수

aws S3를 이용한 이미지 업로드 관련 질문 드려봅니다.

해결된 질문

작성

·

326

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
구글링을 통해 S3 confog, controller, service 를 만들어서 이미지 파일을 버킷에 업로드 하는것 까지는 되는것을 확인했습니다.
 
1) 제가 구현 하고 싶은 기능이 마이페이지에 내 사진을 업로드하고, 수정 할 수 있는 기능을 구현하고 싶은데 여기서 어떻게 이미지를 매개 변수로 받을 수 있을지 감이 잡히지 않습니다 ㅠㅠ

아래처럼 코드를 입력해놓고 보니, 문제가
1. 업로드 controller은 단순히 파일을 버킷에 업로드 하는것이고 이것을 어떻게 마이페이지에 나타내어 줄지 잘 모르겠습니다 ㅠㅠ

2. 수정 controller 부분에 @PathVariable 로 filename 을 받아오면 되겠다고 생각했는데, 프론트쪽에서 파일 이름을 주는것이 불가능 하다고 합니다. 즉 프론트에서 받는 정보 없이 로그인한 사용자가 업로드 한 이미지를 어떻게 구분하여 그것을 페이지에 나타낼 수 있을지 힌트라도 주실 수 있으실까요 ㅠㅠ
 
 
// 이미지 업로드 controller
@PostMapping("/api/mypage")
public PhotoDto uploadProfilePic(@AuthenticationPrincipal UserDetailsImpl userDetails,
@RequestPart(value = "file") List<MultipartFile> multipartFile) throws Exception {
PhotoDto photoDtos = awsService.uploadFile(multipartFile);
return photoDtos;
}
 
// 이미지 수정 controller
@PutMapping("/api/mypage/{fileName}")
public PhotoDto updateProfilePic(@PathVariable String fileName,
@RequestPart(value = "file") List<MultipartFile> multipartFile) throws Exception {

if(multipartFile == null) throw new NullPointerException("파일이 존재하지 않습니다");
awsService.deleteFile(fileName);
PhotoDto photoDtos = awsService.uploadFile(multipartFile);
return photoDtos;
}


// AwsService

 

public PhotoDto uploadFile(List<MultipartFile> multipartFile) {
List<PhotoDto> photoDtos = new ArrayList<>();
// forEach 구문을 통해 multipartFile로 넘어온 파일들 하나씩 fileNameList에 추가
multipartFile.forEach(file -> {
String fileName = createFileName(file.getOriginalFilename());
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.getSize());
objectMetadata.setContentType(file.getContentType());

try(InputStream inputStream = file.getInputStream()) {
amazonS3.putObject(new PutObjectRequest(bucket, fileName, inputStream, objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
} catch(IOException e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "파일 업로드에 실패했습니다.");
}

PhotoDto photoDto = PhotoDto.builder()
.key(fileName)
.path(amazonS3.getUrl(bucket, fileName).toString())
.build();
photoDtos.add(photoDto);
});
return photoDtos.get(0);
}


public String createFileName(String fileName) {
return UUID.randomUUID().toString().concat(getFileExtension(fileName));
}

public String getFileExtension(String fileName) { // file 형식이 잘못된 경우를 확인하기 위해 만들어진 로직이며, 파일 타입과 상관없이 업로드할 수 있게 하기 위해 .의 존재 유무만 판단하였습니다.
try {
return fileName.substring(fileName.lastIndexOf("."));
} catch (StringIndexOutOfBoundsException e) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "잘못된 형식의 파일(" + fileName + ") 입니다.");
}
}

// s3에서 파일 삭제
public String deleteFile(String fileName) {
amazonS3.deleteObject(bucket, fileName);
return fileName + " removed ...";
}



//photoDto

public class PhotoDto {
private String key;
private String path;
}

 

답변

답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!
sy k님의 프로필 이미지
sy k

작성한 질문수

질문하기