Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • JAVA | 파일 다운로드 구현하기
    ▼ Backend/자바 (JAVA) 2021. 9. 30. 15:34
    반응형

    ▶ JAVA 파일 다운로드

    파일명을 파라미터로 받아 다운로드하는 간단한 파일 다운로드 예제입니다.
    여기서 확장하여 파일 최대사이즈, 확장자, 경로등에 대해 프로퍼티에서 관리, 파일 데이터를 데이터베이스로 관리하여 구현할 수 있습니다.

     

    FileController

     

    package com.boot.common.web;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.net.URLEncoder;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/file")
    public class FileController {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @GetMapping("/download")
        public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
            try {
                // fileName 파라미터로 파일명을 가져온다.
                String fileName = request.getParameter("fileName");
    
                // 파일이 실제 업로드 되어있는(파일이 존재하는) 경로를 지정한다.
                String filePath = "C:\\Users\\apple\\Downloads\\";
    
                // 경로와 파일명으로 파일 객체를 생성한다.
                File dFile = new File(filePath, fileName);
    
                // 파일 길이를 가져온다.
                int fSize = (int) dFile.length();
    
                // 파일이 존재
                if (fSize > 0) {
    
                    // 파일명을 URLEncoder 하여 attachment, Content-Disposition Header로 설정
                    String encodedFilename = "attachment; filename*=" + "UTF-8" + "''" + URLEncoder.encode(fileName, "UTF-8");
    
                    // ContentType 설정
                    response.setContentType("application/octet-stream; charset=utf-8");
    
                    // Header 설정
                    response.setHeader("Content-Disposition", encodedFilename);
    
                    // ContentLength 설정
                    response.setContentLengthLong(fSize);
    
                    BufferedInputStream in = null;
                    BufferedOutputStream out = null;
    
                    /* BufferedInputStream
                     * 
                    java.io의 가장 기본 파일 입출력 클래스
                    입력 스트림(통로)을 생성해줌
                    사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림
                    속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음
                    */
                    in = new BufferedInputStream(new FileInputStream(dFile));
    
                    /* BufferedOutputStream
                     * 
                    java.io의 가장 기본이 되는 파일 입출력 클래스
                    출력 스트림(통로)을 생성해줌
                    사용법은 간단하지만, 버퍼를 사용하지 않기 때문에 느림
                    속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 쓰는 경우가 많음
                    */
                    out = new BufferedOutputStream(response.getOutputStream());
    
                    try {
                        byte[] buffer = new byte[4096];
                        int bytesRead = 0;
    
                        /*
                        모두 현재 파일 포인터 위치를 기준으로 함 (파일 포인터 앞의 내용은 없는 것처럼 작동)
                        int read() : 1byte씩 내용을 읽어 정수로 반환
                        int read(byte[] b) : 파일 내용을 한번에 모두 읽어서 배열에 저장
                        int read(byte[] b. int off, int len) : 'len'길이만큼만 읽어서 배열의 'off'번째 위치부터 저장
                        */
                        while ((bytesRead = in .read(buffer)) != -1) {
                            out.write(buffer, 0, bytesRead);
                        }
    
                        // 버퍼에 남은 내용이 있다면, 모두 파일에 출력
                        out.flush();
                    } finally {
                        /*
                        현재 열려 in,out 스트림을 닫음
                        메모리 누수를 방지하고 다른 곳에서 리소스 사용이 가능하게 만듬
                        */
                        in.close();
                        out.close();
                    }
                } else {
                    throw new FileNotFoundException("파일이 없습니다.");
                }
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
        }
    }

     

    호출 URL

    • /file/download?fileName=파일명

    소스 다운로드

    FileController.zip
    0.00MB

     

    반응형

    댓글

Designed by Tistory.