반응형
요즘에는 클라우드에 이미지를 업로드하고 클라우드에서 가져오는 방법이 가장 좋은 방법이긴 한거같다 .
하지만 나는 클라우드 구축도 안되어있고 ,.,
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
반응형
'JAVA' 카테고리의 다른 글
| [Java] Exception Error message Front-end error message로 뿌리기. (0) | 2025.12.22 |
|---|---|
| [JAVA] Naver News API 적용 (2) | 2025.08.26 |
| [JAVA] application.properties에서 log 설정 (1) | 2025.05.27 |
| [JAVA] 파일 다운로드 API 간단하게 구현 + Front End 다운로드 기능 까지. (0) | 2025.04.21 |
| [JAVA] 파일 삭제 간단하게 구현 (0) | 2025.04.21 |