spring boot 파일, 이미지 조회(multipartfile)
2022.01.25 - [SOLUX-완숙이] - spring boot 파일, 이미지 업로드(multipartfile)
spring boot 파일, 이미지 업로드(multipartfile)
게시판을 만들 때 필수적인 사진 저장 코드를 구현해봤다. 1. application.properties #Multipart file spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=200MB spring.servlet.mul..
leeeehhjj.tistory.com
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)
[Spring Boot] 게시판 구현 5 - 게시글 수정 및 삭제, 다중 파일(이미지) 반환 및 조회 처리 MultipartFile
들어가기 앞서 이 글에서는 Spring Boot 초기 설정 및 FrontEnd 관련 내용은 다루지 않습니다. 또한 파일 중에서도 이미지 처리에 중점을 둔 점 참고해주시길 바랍니다. 저번 시간에 이어 이번에는 게
velog.io