ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - 파일 다운로드 하기
    Spring 2019. 2. 25. 22:21

    Spring - 파일 업로드 하기 에서 업로드한 파일을 다운받아보자

    파일 다운로드는 스프링으로 하는 것 과 그냥 서블릿으로 하는 것의 차이가 없다.

    FileController에 fileDownload 메소드를 만들어 준다.

        @RequestMapping("/file/filedownload")
        public void fileDownload(HttpServletRequest request, HttpServletResponse response) {
            String saveDir = request.getSession().getServletContext().getRealPath("/resources/upload/file");
            String fileName = "20190223-223005277_939.jpg";
    
            File file = new File(saveDir + "/" + fileName);
    
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            ServletOutputStream sos = null;
    
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                sos = response.getOutputStream();
    
                String reFilename = "";
                boolean isMSIE = request.getHeader("user-agent").indexOf("MSIE") != -1 || request.getHeader("user-agent").indexOf("Trident") != -1;
    
                if(isMSIE) {
                    reFilename = URLEncoder.encode("이미지 파일.jpg", "utf-8");
                    reFilename = reFilename.replaceAll("\\+", "%20");
                }else {
                    reFilename = new String("이미지 파일.jpg".getBytes("utf-8"), "ISO-8859-1");
                }
    
                response.setContentType("application/octet-stream;charset=utf-8");
                response.addHeader("Content-Disposition", "attachment;filename=\""+reFilename+"\"");
                response.setContentLength((int)file.length());
    
                int read = 0;
                while((read = bis.read()) != -1) {
                    sos.write(read);
                }
    
            }catch(IOException e) {
                e.printStackTrace();
            }finally {
    
                try {
                    sos.close();
                    bis.close();
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    코드에 대한 간단한 설명은 다음과 같다.

    saveDir 에 서버 상의 파일 저장 경로를 불러온다.
    fileName 은 간단히 테스트 용이기 때문에 직접 지정했다.

    FileInputStream 과 BufferedInputStream 을 이용하여 파일을 읽어온다.

    reFilename 은 다운받는 파일의 이름을 지정하는 것이다. fileName과 같이 직접 지정했다.
    IE 로 실행할 경우는 따로 인코딩을 해주어야 한다. IE 는 request의 헤더에 MSIE 또는 Trident가 포함되어 있다.
    IE를 제외한 다른 브라우저로 실행할 경우 한글이 깨지는 것을 방지하기 위해 인코딩을 해준다.

    response의 ContentType과 ContentLength 를 설정하고 헤더를 추가한다.

    InputStream으로 읽어오는 데이터를 ServletOutputStream을 이용하여 출력해준다.

    서버를 실행하고 메소드에 매핑되어 있는 주소로 직접 접근하면 '이미지 파일.jpg' 인 파일을 저장할 수 있게 된다.

    저장받은 파일을 열어보면 파일이 잘 다운로드 됐다는 것을 확인할 수 있다.

    반응형

    'Spring' 카테고리의 다른 글

    Spring - security 암호화 하기  (0) 2019.02.26
    Spring - 트랜잭션 처리하기  (0) 2019.02.25
    Spring - 파일 업로드 하기  (0) 2019.02.23
    Spring - MyBatis 설정하기  (0) 2019.02.20
    Spring - 설정하기  (0) 2019.02.20

    댓글

Designed by Tistory.