TIL 2024-01-08 스프링 이미지 다중 업로드 구현

2024. 1. 9. 02:30TIL

 

RequestDto


      
public record PostCreateRequestDto(
Category category,
@Size(max = 50, message = "제목은 최소 1자 이상, 최대 50자 까지 입력 할 수 있습니다.")
@NotBlank(message = "제목은 필수 입력란입니다.")
String title,
@Size(max = 1000, message = "글 내용은 최소 1자 이상, 최대 1000자 까지 입력 할 수 있습니다.")
@NotBlank(message = "글 내용은 필수 입력란입니다.")
String content,
List<MultipartFile> imageUrlList
) {
}

 

PostService


      
public Long createPost(Long memberId, PostCreateRequestDto requestDto) {
Member member = getMember(memberId);
imageUrlListSizeCheck(requestDto);
List<String> imageUrlList = s3ImageServiceImplV1.saveImageUrlList(
requestDto.imageUrlList());
Map<Integer, Object> imageUrlMap = new HashMap<>(); // json 형식으로 저장 하기 위한 Map
for (int i = 0; i < imageUrlList.size(); i++) {
imageUrlMap.put(i, imageUrlList.get(i));
}
Post post = PostMapper.createPost(requestDto, imageUrlMap, member);
postRepository.save(post);
return post.getId();
}
private void imageUrlListSizeCheck(PostCreateRequestDto requestDto) {
if (requestDto.imageUrlList().size() < PostConstant.IMAGE_MIN_SIZE) {
throw new BusinessException(ErrorCode.POST_IMAGE_MIN_SIZE);
}
if (requestDto.imageUrlList().get(0).isEmpty()) {
throw new BusinessException(ErrorCode.POST_IMAGE_MIN_SIZE);
} // html input으로 submit 했을 때 input이 비어있으면 ""이라는 빈 문자열로 자동 업로드 된다.
// 그래서 이걸 방지하기 위해 위 if문 추가
if (requestDto.imageUrlList().size() > PostConstant.IMAGE_MAX_SIZE) {
throw new BusinessException(ErrorCode.POST_IMAGE_MAX_SIZE);
}
}

 

 

S3Service


      
public List<String> saveImageUrlList(List<MultipartFile> multipartFileList) {
List<String> imageUrlList = new ArrayList<>();
for(MultipartFile multipartFile : multipartFileList) {
if(!multipartFile.getContentType().startsWith("image")) {
throw new BusinessException(ErrorCode.IS_NOT_IMAGE);
}
}
for(MultipartFile multipartFile : multipartFileList) {
String uuidName = UUID.randomUUID().toString();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
try {
amazonS3.putObject(bucket, uuidName, multipartFile.getInputStream(), metadata);
} catch (Exception e) {
throw new BusinessException(ErrorCode.FAIL_UPLOAD);
}
imageUrlList.add(amazonS3.getUrl(bucket, uuidName).toString());
}
return imageUrlList;
}

S3 버킷에서 동일한 이미지 이름이 들어왔을 때 위에다 덮어씌어버려서 파일 이름을 UUID로 생성하게끔 했다.

 

json 저장 하는 법, S3 사용법 등은 나중에 글 수정으로 자세히 적어놓겠습니다... 지금은 새벽 2시 30분ㅋ 2시 20분까지 작업하니 힘드네요 허허

저작자표시 (새창열림)

'TIL' 카테고리의 다른 글

TIL 2024-01-10 AWS S3 객체 삭제~~  (0) 2024.01.11
TIL 2024-01-09 쿼리최적화란  (0) 2024.01.10
TIL 2024-01-07 엔티티에서 Dto 종속성을 갖게 하는 게 맞을까?  (2) 2024.01.07
TIL 2024-01-05 cicd는 왜 생겼을까  (0) 2024.01.06
TIL 2024-01-04 SQL에 배열을 어떻게 저장할까?  (0) 2024.01.05
'TIL' 카테고리의 다른 글
  • TIL 2024-01-10 AWS S3 객체 삭제~~
  • TIL 2024-01-09 쿼리최적화란
  • TIL 2024-01-07 엔티티에서 Dto 종속성을 갖게 하는 게 맞을까?
  • TIL 2024-01-05 cicd는 왜 생겼을까
wonow_
wonow_
꾸준히 성장하는 개발자 WONOW 입니다. 🤗
wonow_
wonow_
wonow_
전체
오늘
어제
  • 분류 전체보기
    • Language
      • JAVA
    • TIL
    • 코딩테스트
      • 프로그래머스
      • 백준
    • 프로젝트
      • JAVA
      • Spring
    • 기타
    • ERROR
      • Spring
    • CS
      • 알고리즘
      • DB
      • Kafka
    • 잡담
    • 활동
      • 척척박사

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • 문자열 붙여서 출력하기
  • 프로그래머스
  • 오블완
  • 문자열 돌리기
  • 티스토리 꾸미기
  • 나는바봉가봉가
  • 홀짝 구분하기
  • 공부열심히하자

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
wonow_
TIL 2024-01-08 스프링 이미지 다중 업로드 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.