1. MultipartFile의 기본 저장 위치 확인
Spring Boot에서 MultipartFile을 처리할 때 기본적으로 JVM의 임시 디렉토리에 저장된다.
이 경로는 OS에 따라 다를 수 있으며, 다음 코드를 사용하여 확인할 수 있다.
시스템의 기본 임시 저장 디렉토리 확인
System.out.println(System.getProperty("java.io.tmpdir"));
출력 예시
Linux/macOS
/tmp/
Windows
C:\Users\USERNAME\AppData\Local\Temp\
임시 디렉토리는 서버가 재시작될 경우 자동으로 삭제될 수 있으므로, 파일을 특정 디렉토리에 저장하는 것이 권장된다.
2. MultipartFile의 임시 저장 경로 얻기
Spring의 MultipartFile 객체는 기본적으로 임시 파일로 저장되지만,
파일의 저장 경로를 직접 제공하지 않으므로, 파일을 특정 경로에 저장한 후 해당 경로를 반환하는 방식이 필요하다.
파일을 임시 디렉토리에 저장 후 경로 확인
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 1. 시스템 기본 임시 디렉토리 가져오기
String tempDir = System.getProperty("java.io.tmpdir");
// 2. 저장할 파일 경로 설정
File tempFile = new File(tempDir + File.separator + file.getOriginalFilename());
// 3. 파일 저장
file.transferTo(tempFile);
// 4. 저장된 파일 경로 반환
return ResponseEntity.ok("File saved at: " + tempFile.getAbsolutePath());
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + e.getMessage());
}
}
출력 예시
Linux/macOS
File saved at: /tmp/sample-file.txt
Windows
File saved at: C:\Users\USERNAME\AppData\Local\Temp\sample-file.txt
3. HttpServletRequest를 사용한 파일 접근
@RequestParam 대신 HttpServletRequest를 사용하여 파일 정보를 가져올 수도 있다.
HttpServletRequest를 사용한 파일 정보 확인
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(HttpServletRequest request) {
try {
Collection<Part> parts = request.getParts();
for (Part part : parts) {
String submittedFileName = part.getSubmittedFileName();
if (submittedFileName != null) {
// 파일 정보 가져오기
String location = part.getHeader("content-disposition");
return ResponseEntity.ok("File Location: " + location);
}
}
return ResponseEntity.badRequest().body("No file found!");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + e.getMessage());
}
}
주의할 점
- part.getSubmittedFileName()을 사용하면 파일명을 가져올 수 있지만,
임시 저장 경로는 제공되지 않으므로 직접 저장 후 경로를 반환하는 것이 안전하다.
4. 특정 위치에 저장 후 경로 확인
파일을 특정 디렉토리에 저장한 후 해당 경로를 반환하는 것이 가장 안전한 방법이다.
아래는 C:/uploads/ 디렉토리에 파일을 저장하는 방법이다.
파일을 특정 디렉토리에 저장하는 방식
@PostMapping("/upload")
public ResponseEntity<String> saveFile(@RequestParam("file") MultipartFile file) {
try {
// 1. 저장할 디렉토리 설정
String uploadDir = "C:/uploads/";
File uploadFolder = new File(uploadDir);
// 2. 디렉토리가 존재하지 않으면 생성
if (!uploadFolder.exists()) {
uploadFolder.mkdirs();
}
// 3. 저장할 파일 경로 설정
File savedFile = new File(uploadDir + file.getOriginalFilename());
// 4. 파일 저장
file.transferTo(savedFile);
// 5. 저장된 파일의 위치 반환
return ResponseEntity.ok("File saved at: " + savedFile.getAbsolutePath());
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + e.getMessage());
}
}
출력 예시
File saved at: C:/uploads/sample-file.txt
5. 정리
- MultipartFile은 기본적으로 JVM의 임시 디렉토리(java.io.tmpdir)에 저장됨
- 파일의 경로를 직접 가져올 수 없으므로, file.transferTo(new File("경로"))를 사용하여 특정 위치에 저장 후 경로 확인
- HttpServletRequest를 사용하여 Part 객체를 통해 파일을 가져올 수도 있으나, 파일의 저장 위치를 제공하지 않음
- 가장 안전한 방법: 파일을 특정 디렉토리에 저장한 후 해당 경로를 반환
반응형
'Backend > Spring(활용)' 카테고리의 다른 글
Spring 기반 Quartz Scheduler 기본 예제 코드(1) - 구조적 설계와 흐름 설명 (0) | 2025.04.03 |
---|---|
Spring 의존관계 자동 주입(DI) 방식 선택 기준 정리 (1) | 2025.04.01 |
CORS 오류를 해결하기 위한 다양한 방법 (0) | 2025.02.26 |
HDFS WebHDFS API를 활용한 대용량 파일 다운로드 구현 (Spring Boot + Vue.js 예제) (1) | 2025.02.13 |
컴포넌트 스캔의 필터 활용 - Spring (0) | 2023.10.27 |