728x90
SpringBoot · intelliJ · OracleDB · Thymeleaf
이전글 : [Springboot] 게시판 파일 업로드 -1 [37] (tistory.com)
저번 게시글에 파일업로드 작업 후 개선 해야 할 점 있었는데
IDE에서 빌드를 하지않으면 파일이 바로 출력되지않는 문제점이었습니다.
스프링부트에서 static폴더는 정적리소스폴더인데,
여기 안에 사용자가 이미지를 업로드하게 설계를 했기에 생긴 이슈 였습니다.
해당 문제를 해결하고, 빌드하지 않아도 바로 이미지가 출력되게 수정하였다.
application.properties 경로 추가
#파일 한개 당 최대사이즈
spring.servlet.multipart.maxFileSize=20MB
#요청당 최대 파일 크기
spring.servlet.multipart.maxRequestSize=100MB
#상품 이미지 업로드 경로
ImgLocation=C:/repick/img/
#리소스 업로드 경로
uploadPath=file:///C:/repick/img/
컴퓨터에서 어떤 경로로 저장할지 관리하기위해 프로퍼티에 설정 추가를 해야한다.
WebMvcConfig.java 생성
import org.springframework.beans.factory.annotation.Value;
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 WebMvcConfig implements WebMvcConfigurer {
//uploadPath프로퍼티값을 읽어온다
@Value("${uploadPath}")
String uploadPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/photo/**")
//웹브라우저에 입력하는 url에 /photo 로 시작하는 경우 uploadPath에 설정한 폴더 기준으로 파일을 읽어오도록 설정
.addResourceLocations(uploadPath);
//로컬컴퓨터에 저장된 파일을 읽어올 root경로
}
}
디렉터리 리소스를 웹 리소스로 핸들링 해주는 config를 작성합니다.
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.File;
import java.util.*;
import com.gosari.repick_project.exception.DataNotFoundException;
import org.springframework.web.multipart.MultipartFile;
@RequiredArgsConstructor
@Service
public class QuestionService {
//파일저장할위치
@Value("${ImgLocation}")
private String imgLocation;
/*질문데이터를 저장하는 create메서드*/
public void create(String subject, String content, SiteUser user, String category,
MultipartFile file) throws Exception{
String projectPath = imgLocation; //파일저장위치 = projectPath
UUID uuid = UUID.randomUUID(); //식별자.랜덤으로 이름만들어줌
String fileName = uuid + "_" + file.getOriginalFilename(); //저장될파일이름지정=랜덤식별자_원래파일이름
File saveFile = new File(projectPath, fileName); //빈껍데기생성 이름은 fileName, projectPath라는 경로에담김
file.transferTo(saveFile);
Question q = new Question();
q.setSubject(subject);
q.setContent(content);
q.setCreateDate(new Date());
q.setAuthor(user);
q.setCategory(category);
q.setFilename(fileName); //파일이름
q.setFilepath(projectPath + fileName); //저장경로,파일이름
this.questionRepository.save(q); //파일저장
}
@Value로 properties에서 파일저장할위치를 가져와 저장합니다.
@Value 어노테이션은 properties를 읽을때 사용합니다.
<div class="detail-img">
<img onerror="this.style.visibility='hidden'" th:src="@{|/photo/${question.filename}|}"/>
</div>
업로드한 이미지를 보여주는 html파일에서
th:src="@{|/photo/${question.filename}|}" 을 넣어주어,
폼에서 업로드한 이미지를 출력하였습니다.
참고 링크 :
728x90
'Follow Work > SpringbootBoard' 카테고리의 다른 글
[Springboot] 에러페이지 설정하기 [40] (0) | 2022.10.14 |
---|---|
[Springboot] 이전글 다음글 없을 시 클릭 막기 [39] (0) | 2022.10.14 |
[HTML CSS] 반응형 테이블 디자인 (0) | 2022.10.14 |
[HTML] iframe 유튜브 동영상 자동 연속재생 (14) | 2022.10.06 |
[Springboot] Jsoup 이용하여 웹 크롤링하기 (0) | 2022.10.02 |