파일 동적 저장

정윤서·2023년 12월 19일
0
post-custom-banner
  • Configuration
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {
	
    // 저장할 파일 경로
    private String restaurantPath = "C:/uploads/restaurant";

    private String reviewPath = "C:/uploads/review";

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/restaurant/image/**")
                .addResourceLocations("file:" + restaurantPath + "/");

        registry.addResourceHandler("/review/image/**")
                .addResourceLocations("file:" + reviewPath + "/");
    }
}
  • Service
private String uploadPath = "C:/uploads/restaurant"; // config에서 작성했던 파일 경로

public void uploadImage(Restaurant restaurant, MultipartFile image) throws IOException {
        File uploadDirectory = new File(uploadPath);
        // 파일 경로 폴더가 없을 때 폴더 생성
        if (!uploadDirectory.exists()) {
            uploadDirectory.mkdirs();
        }
        // 받아오는 이미지 없을 때 기본 이미지로 세팅. 없어도 되는 코드.
        if (image.isEmpty())
            restaurant.setImage("/image/startImage.jpg");
        else {
        	// 원본 파일에서 파일 확장자만 꺼내오기
            String fileExtension = StringUtils.getFilenameExtension(image.getOriginalFilename()); 
            
            // 파일 이름 정하고 확장자 뒤에 붙이기  (파일 이름 겹치면 안돼서 고유 아이디랑 합침.)
            String fileName = restaurant.getId() + "." + fileExtension; 
            
            // 파일의 전체 경로 생성
            File dest = new File(uploadPath + File.separator + fileName); 
            
            // 이미지의 바이트 데이터를 경로에 지정된 폴더로 복사 -> 서버의 파일 시스템에 저장
            FileCopyUtils.copy(image.getBytes(), dest); 
            
            // 이미지 경로 저장
            restaurant.setImage("/restaurant/image/" + restaurant.getId() + "." + fileExtension); 
        }
        this.restaurantRepository.save(restaurant);
    }
post-custom-banner

0개의 댓글