-
spring boot 파일, 이미지 조회(multipartfile)SOLUX-완숙이 2022. 1. 25. 14:57
2022.01.25 - [SOLUX-완숙이] - spring boot 파일, 이미지 업로드(multipartfile)
1. build.gradle
implementation 'commons-io:commons-io:2.6'
2. PhotoController
@CrossOrigin @RestController @RequiredArgsConstructor public class PhotoController { private final PhotoService photoService; @GetMapping( value = "/photo/{photoId}", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE} ) public ResponseEntity<byte[]> getPhoto(@PathVariable Long photoId) throws IOException { return photoService.getPhoto(photoId); } }
- produces 는 getMapping으로 조회한 결과를 MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE 형태로 반환하도록 하겠다는 의미
- 이미지는 byte[] 형태를 가지므로 return 값을 byte[]으로 한다.
3. PhotoResponseDto
@Getter @NoArgsConstructor public class PhotoResponseDto { private String originalName; private String filePath; private Long fileSize; @Builder public PhotoResponseDto(String originalName, String filePath, Long fileSize) { this.originalName = originalName; this.filePath = filePath; this.fileSize = fileSize; } }
4. PhotoService
import lombok.RequiredArgsConstructor; import org.apache.commons.io.IOUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import solux.wansuki.OurNeighbor_BE.domain.Photo.Photo; import solux.wansuki.OurNeighbor_BE.domain.Photo.PhotoRepository; import solux.wansuki.OurNeighbor_BE.dto.Photo.PhotoResponseDto; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @Service @RequiredArgsConstructor public class PhotoService { private final PhotoRepository photoRepository; @Transactional public ResponseEntity<byte[]> getPhoto(Long photoId) throws IOException { PhotoResponseDto responseDto = findById(photoId); String absolutePath = new File("").getAbsolutePath() + File.separator + File.separator; String path = responseDto.getFilePath(); InputStream inputStream = new FileInputStream(absolutePath + path); byte[] images = IOUtils.toByteArray(inputStream); inputStream.close(); return new ResponseEntity<>(images, HttpStatus.OK); } @Transactional public PhotoResponseDto findById(Long id) { Photo photo = photoRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("해당 포토 없음")); PhotoResponseDto responseDto = PhotoResponseDto.builder() .originalName(photo.getOriginalName()) .filePath(photo.getFilePath()) .fileSize(photo.getFileSize()) .build(); return responseDto; } }
photoId를 통해 Photo의 path를 얻어오고 해당 경로의 파일을 fileInputStream을 통해 바이트로 스트림 해준다.
참고
[Spring Boot] 게시판 구현 5 - 게시글 수정 및 삭제, 다중 파일(이미지) 반환 및 조회 처리 MultipartFile (velog.io)
'SOLUX-완숙이' 카테고리의 다른 글
Access token으로 사용자 정보 가져오기 (1) 2022.01.28 spring boot 파일, 이미지 업로드(multipartfile) (0) 2022.01.25 spring security+jwt 회원가입, 로그인 #4 (0) 2022.01.23 spring security+jwt 회원가입, 로그인 #3 (0) 2022.01.17 JWT(Json Web Token) (0) 2022.01.17