Spring

[Java] Spring 리소스(Resource) 파일 읽어오기, 다운로드

nineDeveloper 2020. 3. 19. 10:13
728x90

코틀린이 필요하다면 링크 참조: https://freedeveloper.tistory.com/465

 

[Kotlin] Spring 리소스(Resource) 파일 읽어오기, 다운로드

https://freedeveloper.tistory.com/193?category=808728 Spring, Java 리소스(Resource) 파일 읽어오기, 다운로드 Spring, Java 리소스(Resource) 파일 읽어오기, 다운로드 Maven 또는 Gradle 기반 프로젝트는 /s..

freedeveloper.tistory.com

 

Maven 또는 Gradle 기반 프로젝트는 /src/main/resources 디렉토리에 리소스 파일을 저장하도록 되어 있다
이 디렉토리에 위치한 파일들은 .jar 파일로 빌드시 최상위인 루트 디렉토리에 위치하게 되는데 이 말은 런타임시 해당 파일들이 ROOT CLASSPATH에 위치한다는 것을 의미한다

CLASSPATHROOT에 위치하므로 위와 같이 절대 경로인 /를 앞에 명시함으로서 리소스 파일을 로드할 수 있다. 상대 경로를 명시할 경우 명령을 호출한 클래스의 위치에 따라 경로가 달라진다

리소스 파일 읽어오기

getClass().getResourceAsStream(String path): resources 디렉토리 안에 있는 파일을 InputStream 형태로 반환 해준다

만약 대상 리소스 파일이 존재하지 않을 경우 java.lang.NullPointerException을 발생시킨다.

resources/file/sampleUpload.xlsx 파일을 읽어 오는 예시
String fileName = "sampleUpload.xlsx";
Path filePath = Paths.get(File.separatorChar + "file", File.separatorChar + fileName);
getClass().getResourceAsStream(filePath.toString())

리소스 파일 문자열 획득하기

대상 리소스 파일이 텍스트일 경우 Apache Commons IO가 제공하는 IOUtils.toString()를 이용하여 대상 리소스 파일을 간편하게 문자열로 획득할 수 있다.

// /src/main/resources/something.txt 파일을 읽어 온다.
String something = IOUtils.toString(getClass().getResourceAsStream("/something.txt"), "UTF-8");

리소스 파일 다운로드 하기

서비스 구현부

/**
 * Sample 엑셀 다운로드
 * @return
 * @throws IOException
 */
public ResponseEntity<Resource>  getSampleExcel() throws IOException {

    String fileName = "sampleUpload.xlsx";

    Path filePath = Paths.get(File.separatorChar + "file", File.separatorChar + fileName);
    Resource resource = new InputStreamResource(getClass().getResourceAsStream(filePath.toString()));

    return ResponseEntity.ok()
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .cacheControl(CacheControl.noCache())
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + "")
            .body(resource);
}

컨트롤러 구현부

@ApiOperation(value = "Sample 엑셀 양식 다운로드")
@GetMapping("/excel")
public ResponseEntity<Resource> getSampleExcel() throws IOException {
    return sampleService.getSampleExcel();
}

참고글

728x90