Knowledge/Spring

스프링에서 파일다운로드 구현하는 방법

TakeKnowledge 2019. 9. 20. 08:13
반응형

일단 서버에 파일은 있고 데이터베이스에 파일 정보는 저장되어 있다고 가정한다

( 참고 : 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 - https://takeknowledge.tistory.com/61 )

 

사실 업로드를 잘 알고 있다면 다운로드도 쉽게 이해할 수 있다. outputStream과 inputStream의 역할만 바뀔 뿐 업로드와 크게 다르지 않기 때문이다. 넘어온 파일을 찾을 수 있는 파라미터로 파일 정보 찾고, 헤더에 정보 세팅하고, inputStream에서 outputStream으로 파일 정보 옮겨주면 끝! 바로 코드로 보자!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    @GetMapping(path = "/download/{id}")
    public void fileDownload(@PathVariable(name = "id") Integer fileId, HttpServletResponse response) {
        
        FileInfo fileInfo = fileService.getFileInfo(fileId);
        // 파일 정보를 가지고 온다 ( 여기서 FileInfo는 스프링에 있는 자료형이 아니고 제가 만든 DTO 입니다 )
 
        String fileName = fileInfo.getFileName();
        // 파일 이름 가지고 오고
        String tempfileName = fileInfo.getSaveFileName();
        // 폴더까지 지정되어 있는 파일명 가져와서
        StringBuilder sb = new StringBuilder("c:/tmp/");
        sb.append(tempfileName);
        // 파일 저장되어 있는 경로뒤에 붙여줘서
        String saveFileName = sb.toString();
        // saveFileName을 만든다.
        
        String contentType = fileInfo.getContentType();
        // contentType 가져오고
 
        File file = new File(saveFileName);
        long fileLength = file.length();
        // 데이터베이스에 없는 정보는 파일로 만들어서 가져온다. 이 경우엔 Content-Length 가져온 것
 
        response.setHeader("Content-Disposition""attachment; filename=\"" + fileName + "\";");
        response.setHeader("Content-Transfer-Encoding""binary"); 
        response.setHeader("Content-Type", contentType);
        response.setHeader("Content-Length""" + fileLength);
        response.setHeader("Pragma""no-cache;");
        response.setHeader("Expires""-1;");
        // 그 정보들을 가지고 reponse의 Header에 세팅한 후
        
        try (FileInputStream fis = new FileInputStream(saveFileName); OutputStream out = response.getOutputStream();) {
            // saveFileName을 파라미터로 넣어 inputStream 객체를 만들고 
            // response에서 파일을 내보낼 OutputStream을 가져와서  
            int readCount = 0;
            byte[] buffer = new byte[1024];
            // 파일 읽을 만큼 크기의 buffer를 생성한 후 
            while ((readCount = fis.read(buffer)) != -1) {
                out.write(buffer, 0, readCount);
                // outputStream에 씌워준다
            }
        } catch (Exception ex) {
            throw new RuntimeException("file Load Error");
        }
 
    }

 

참 쉽죠? 별거 없습니다!

 

참고 

 

 

[LECTURE] 3) 파일 다운로드 구현하기 : edwith

들어가기 전에 이번 시간엔 Controller를 이용해 파일을 다운로드 하는 방법에 대해 알아보도록 하겠습니다. 학습 목표 파일을 다운로드 하는 컨트롤러를 작성할 수 있다. 핵심 ... - moons

www.edwith.org

반응형