SOLUX-완숙이

spring boot 파일, 이미지 조회(multipartfile)

leeeehhjj 2022. 1. 25. 14:57

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