본문 바로가기
JAVA

[Java] 이미지 미리보기 C: 경로에 있는 파일 불러오기

by 승븐지 2025. 7. 4.
반응형
요즘에는 클라우드에 이미지를 업로드하고 클라우드에서 가져오는 방법이 가장 좋은 방법이긴 한거같다 .
하지만 나는 클라우드 구축도 안되어있고 ,., 
JWT SECURITY등 다 설정을 이미 해놨는데 불러오는 방법이다 .
우선은 Spring Boot + java 이다 . 소스를 보여주겠다.


 

1.컨트롤러

@Operation(summary = "QR 시스템 이미지 업로드", description = "카메라 또는 갤러리에서 선택한 이미지를 서버에 저장")
	@PostMapping("/uploadQrImage")
	public ResponseEntity<?> uploadQrImage(
			@RequestParam("file") MultipartFile file,
			@RequestParam("cdCompany") String cdCompany,
			@RequestParam("cdBizarea") String cdBizarea,
			@RequestParam("cdQr") String cdQr) {
		try {
			QrSystemUploadFileRes uploadFileRes = qrSystemService.uploadTest(file,cdCompany,cdBizarea,cdQr);
			return new ResponseEntity<>(uploadFileRes, HttpStatus.OK);
		} catch (Exception e) {
			return ResponseEntity.badRequest().body(new CommonErrorData("UPLOAD_FAILED"));
		}
	}

 

2. 서비스 

public QrSystemUploadFileRes uploadTest(MultipartFile file, String cdCompany, String cdBizarea, String cdQr) throws Exception {
		if (file == null || file.isEmpty()) {
			throw new IllegalArgumentException("파일이 비어있습니다.");
		}

		Test checkReq = new Test();
		checkReq.setCdCompany(cdCompany);
		checkReq.setCdBizarea(cdBizarea);
		checkReq.setCdQr(cdQr);

		SewingQrSystemRes qrInfo = getSewingQrSystemInfo(checkReq);
		if (qrInfo == null) {
			throw new IllegalArgumentException("QR_NOT_FOUND");
		}

		String folderType ="TEST1"
		// 업로드 경로 생성
		String uploadPath = Paths.get(uploadDir, "TEST1", "QrImg", folderType).toString();
		Files.createDirectories(Paths.get(uploadPath));

		// 파일 확장자 추출
		String originalFilename = file.getOriginalFilename();
		String extension = "";
		if (originalFilename != null && originalFilename.contains(".")) {
			extension = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); // 예: .png, .jpg
		}

		// 중복 방지 파일명 생성 로직
		String baseFilename = cdQr;
		String filename = baseFilename + extension;
		Path filePath = Paths.get(uploadPath, filename);
		int index = 1;
		while (Files.exists(filePath)) {
			filename = baseFilename + "-" + index + extension;
			filePath = Paths.get(uploadPath, filename);
			index++;
		}

		// 파일 저장
		file.transferTo(filePath.toFile());

		// DB 이미지 경로 저장
		String dbImgPath = "/uploads/Test/QrImg/" + folderType + "/";
		qrSystemMapper.updateTest(dbImgPath, filename, cdCompany, cdBizarea, cdQr);

		return new QrSystemUploadFileRes(dbImgPath, filename);
	}

 

3.Mapper

void updateTest(String imgPath,String imgFname, String cdCompany, String cdBizarea, String cdQr);

 

4.XML 

XML은 그래도 ,, 보안상 보여주진못하겠다..

 

 

5. WebConfig 설정추가

@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE")
				.allowCredentials(true).maxAge(3600);
	}
    
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/uploads/**")
				.addResourceLocations("file:///C:/upload/"); // 실제 폴더 경로 추가 !! 
	}
}

 

 

6.SecurityConfig 에서 AuthorizedUrl을 추가해줘야한다.

//upload만 보면됌. 나머지는 개인 설정.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable().authorizeRequests()
            .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html", "/swagger-resources/**", // Swagger 관련 경로 허용
                    "/webjars/**","/uploads/**") 
            .permitAll().anyRequest().authenticated().and().exceptionHandling()
            .accessDeniedHandler(customAccessDeniedHandler).authenticationEntryPoint(customAuthenticationEntryPoint)
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);

    return http.build();
}

 

 

7.JWT 인증 요청하지 않는 경로에 추가로 지정

public class JwtRequestFilter extends OncePerRequestFilter {

	private final JwtTokenUtil jwtTokenUtil;

	// 인증이 필요하지 않은 경로
	private static final List<String> EXCLUDE_URLS = Arrays.asList("/uploads/**");

	@Autowired
	public JwtRequestFilter(JwtTokenUtil jwtTokenUtil) {
		this.jwtTokenUtil = jwtTokenUtil;
	}

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {

		// 인증이 필요하지 않은 경로인지 확인
		String requestPath = request.getRequestURI();
		if (EXCLUDE_URLS.contains(requestPath)) {
			chain.doFilter(request, response);
			return;
		}
		final String requestTokenHeader = request.getHeader("Authorization");
}

 

우선은 로컬 PC에 특정파일을 읽을려면은 인증 및 권한을 통과시켜줘야한다 . 

이러한 과정이 5,6,7번에 있을것이고 최종적으로 내가 원하는 폴더에 파일이 업로드 된거를 확인 한다. 

(나는 Swagger를 사용하여 API 테스트를 해보았다 .) 이후에는 프론트엔드와 연동을 해보겠다.

2025.07.04 - [JavaScript/React] - [React] 이미지 미리보기 C: 경로에 있는 파일 불러오기

 

[React] 이미지 미리보기 C: 경로에 있는 파일 불러오기

2025.07.04 - [JAVA] - [Java] 이미지 미리보기 C: 경로에 있는 파일 불러오기 [Java] 이미지 미리보기 C: 경로에 있는 파일 불러오기요즘에는 클라우드에 이미지를 업로드하고 클라우드에서 가져오는 방

ycds.tistory.com

 

반응형