본문 바로가기
개발/Spring

[SpringBoot] 외부 파일 불러오기

by 코딩하는 흰둥이 2024. 5. 8.

기본적으로 /resources/static/ 폴더 안에 파일을 읽어오지만

그 외의 외부폴더에서 파일을 참조할 경우 보안상의 문제로 파일을 불러오지 않는다

 

파일이 동적으로 생성되거나 관리가 되어야 하는 상황에 맞지 않기에 동적으로 관리하는 방법을 정리해 본다

(파일이 배포된 상태 거나 War 상태일 경우 /resources/static/ 안에 파일을 넣으려면 재배포 및 War를 빌드해야 한다)

 

 

 

폴더 생성

 

 

src/main/resources 가 아닌 src 폴더와 같은 위치에 upload 폴더를 생성하였다

(C:// , D:// 가 아닌 프로젝트 내의 폴더에서 파일을 관리하고 싶어서)

 

 

 

예시 화면

 

강아지 사진 옆에 태그를 추가하여 본다

 

강아지 이미지는 div clss 내 login-image 로 출력되고 있다

 

이미지가 안나오고 있다

 

 

 

config 파일 생성

 

참고

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.file.Path;
import java.nio.file.Paths;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private String connectPath = "/uploadPath/**";
    final Path FILE_ROOT = Paths.get("./").toAbsolutePath().normalize();    // resources 폴더가 아닌 위치 일때 , 현재 위치를 지정함
    private String uploadPath = FILE_ROOT.toString() + "/upload/";

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler(connectPath)                	    // src 에 들어갈 경로
                .addResourceLocations("file:///"+uploadPath);               // 파일 경로
    }
}

 

 

 

SpringSecurity 사용 중이라면
@EnableWebSecurity
@Configuration
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.csrf().disable(); // @EnableWebSecurity 이 csrf 공격을 방지하기 때문에 해당 기능을 disable로 변경

        http
                .authorizeRequests()
                .requestMatchers("/").hasRole("USER")                 // 권한체크 - 내부적으로 ROLE_ 을 붙이기 때문에 ROLE_ 뒷부분만 적어준다
                .requestMatchers("/board/create").hasAnyRole("ADMIN") // 권한체크 - 내부적으로 ROLE_ 을 붙이기 때문에 ROLE_ 뒷부분만 적어준다
                .requestMatchers("/bootstrap/**", "/login", "/register", "/logout" , "/start" , "/stop" , "/uploadPath/**").permitAll() // 해당 경로는 권한이 없어도 접속할 수 있다
                .anyRequest().authenticated();

....
...
...
..
.

 

config.java 에서 설정한 connectPath 의 경로인 "/uploadPath/**" 를 권한과 상관없는 예외 처리를 해야 한다

처리를 하지 않으면 오류도 출력되지 않아 찾기 힘들다...

 

 

 

이미지 태그 경로 설정

처음 설정했던 <img> 태그 경로

 

 

WebConfig 에서 설정한 경로로 잡아준다

 

 

 

결과

이미지가 정상적으로 나온다

 

 

댓글