Backend/Spring(활용)

Spring Boot에서 MultipartFile 저장 위치 확인 및 활용 방법

개발자-제이 2025. 2. 27. 14:57

 

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 객체를 통해 파일을 가져올 수도 있으나, 파일의 저장 위치를 제공하지 않음
  • 가장 안전한 방법: 파일을 특정 디렉토리에 저장한 후 해당 경로를 반환
반응형