스프링부트+jsp로 배달사이트 만들기-16 리뷰 사진 올리기

2021. 12. 9. 12:57스프링부트

사진 업로드 시 저장을 프로젝트 내부에 하게되면 재배포시 파일이 날아갈 수 있으니 외부 경로에 저장 할 수 있게 합니다 

외부 경로 설정을 위해 config패키지에 설정파일을 추가합니다

@Configuration
public class WebConfig implements WebMvcConfigurer {
	
	@Value("${resource.path}")
	private String resourcePath;
	
	@Value("${upload.path}")
	private String uploadPath;
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler(uploadPath)
				.addResourceLocations(resourcePath);
	}

}

uploadPath로 요청이 들어오면 resourcePath에서 찾겠다는 의미입니다

공통적으로 사용될 경로이므로 application.properties에 지정해 놓고 불러 쓸 수 있도록 하겠습니다

application.properties에 추가

#/upload 로 요청이 들어오면 resource.path에서 찾기 
resource.path=file:///C:/resource/
upload.path=/upload/**

#이미지 파일 업로드 위치
resource=C:/resource

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

 

저는 C: 아래에 resource라는 이미지를 관리 할 폴더를 생성하고 이미지를 찾을 경로와 이미지를 저장할 경로, 이미지 최대용량을 설정했습니다

 

 

uil패키지에 UploadFile클래스를 생성합니다

package com.baemin.util;

import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

@Component
public class UploadFile {
	
	@Value("${resource}")
	private String path;

	public String makeDir() {
		Calendar cal = Calendar.getInstance();
		String yearPath = File.separator +cal.get(Calendar.YEAR) + "";
		String monthPath = yearPath + File.separator + new DecimalFormat("00").format(cal.get(Calendar.MONTH) + 1);
		String datePath = monthPath + File.separator + new DecimalFormat("00").format(cal.get(Calendar.DATE));
		
		if(!new File(path+datePath, datePath).exists()) {
			new File(path, yearPath).mkdir();
			new File(path, monthPath).mkdir();
			new File(path, datePath).mkdir();
		}
		return datePath;
	}
	
	public String fildUpload(MultipartFile file) throws IOException {
		
		UUID uuid = UUID.randomUUID();
		
		String fileName = File.separator + uuid + "_" + file.getOriginalFilename();
		
		String dir = makeDir();
		
		File uploadFile = new File(path + dir, fileName);
		
		uploadFile.createNewFile();
		
		FileCopyUtils.copy(file.getBytes(), uploadFile);
		
		return File.separator + "upload" + dir + fileName;
	}
}

makeDir()은 path로 설정한 경로 아래에 현재시각을 이름으로 폴더를 생성합니다 ex) 2021/12/09

 

fildUpload()의

File uploadFile = new File(path + dir, fileName);

uploadFile.createNewFile();

makeDir()로 생성한 폴더 아래에 uuid로 랜덤한 문자를 생성 후 파일의 원래 이름을 더해 빈 파일을 생성합니다 

 

빈 파일에 파일정보를 저장할 땐 FileCopyUtils.copy 또는 MultipartFile클래스의 transferTo를 사용해 저장 할 수 있습니다

이후 db에 파일의 경로를 저장하기 위해 파일경로+이름을 반환합니다

 

StoreController상단에 UploadFile을 주입받을 수 있도록 추가합니다

@Autowired
private UploadFile uploadFile;

 

리뷰작성과 리뷰수정 메서드를 수정합니다

// 리뷰 작성
@PostMapping("/store/review")
public String review(Review review, MultipartFile file, @AuthenticationPrincipal LoginService user) throws IOException {
    if (file.isEmpty()) {
        String img = "";
        review.setReviewImg(img);
    } else {
        String img = uploadFile.fildUpload(file);
        review.setReviewImg(img);
    }
    long userId = user.getUser().getId();
    review.setUserId(userId);

    storeService.reviewWrite(review);

    return "redirect:/orderList";
}


// 리뷰 수정
@PostMapping("/store/reviewModify")
public String reviewModify(Review review, MultipartFile file, @AuthenticationPrincipal LoginService user) throws IOException {
    if(!file.isEmpty()){
        String img = uploadFile.fildUpload(file);
        review.setReviewImg(img);
    }
    long userId = user.getUser().getId();
    review.setUserId(userId);

    storeService.reviewModify(review);

    return "redirect:/orderList";
}

 

 

사진 첨부 후 가게에 리뷰 사진이 올라간 걸 볼 수 있습니다

 

-- 배달 완료 시 댓글 가능으로 변경 

-- 사진 여러장 첨부 아직 미구현