본문 바로가기
IT 개발/JAVA

JAVA - ZIP 파일 다운로드

by Love of fate 2021. 10. 25.
728x90
반응형

[JAVA - ZIP 파일 다운로드]

 

 

● Zip 파일 다운로드

   - zip 파일 다운로드 시 ContentType은 application/zip;으로 한다

   - ZipOutputStream/ZipInputStream이 java.util.zip에 있다

     해당 클래스로 Zip 파일생성/ 다운로드/ 업로드가 가능하니 사용해보는게 좋을것 같다

 

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    @GetMapping(value = "/downloadProgram")
    public void downloadProgram(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "type"String type
    ) {
        ResultMap result = new ResultMap();
 
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        ServletOutputStream so = null;
        BufferedOutputStream bos = null;
 
        try {
 
            Path targetPath = null;
            if (type.equalsIgnoreCase("win"|| type.equals("win")) targetPath = Paths.get(commonService.getSystemEnv().getDgsnpgmFlpth());
            else targetPath = Paths.get(commonService.getSystemEnv().getMobileappFlpth());
 
            String flpth = submitService.getDownloadFilePath(type);
            targetPath = targetPath.resolve(flpth);
 
            File file = new File(targetPath.toString());
 
            if (file.exists()) {
 
                String downName = null;
                String browser = request.getHeader("User-Agent");
 
                if (browser.contains("MSIE"|| browser.contains("Trident"|| browser.contains("Chrome")) {// 브라우저 확인 파일명
                    downName = URLEncoder.encode(file.getName(), "UTF-8").replaceAll("\\+""%20");
                } else {
                    downName = new String(file.getName().getBytes("UTF-8"), "ISO-8859-1");
                }
 
                response.setHeader("Content-Disposition""attachment; filename=\"" + downName + "\";");
                response.setContentType("application/zip;");
                response.setHeader("Content-Transfer-Encoding""binary;");
 
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                so = response.getOutputStream();
                bos = new BufferedOutputStream(so);
 
                byte[] data = new byte[2048];
                int input = 0;
 
                while ((input = bis.read(data)) != -1) {
                    bos.write(data, 0, input);
                    bos.flush();
                }
 
                if (bos != null) bos.close();
                if (bis != null) bis.close();
                if (so != null)  so.close();
                if (fis != null) fis.close();
 
            }else{
                throw new Exception();
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
cs

 

window.location.href로 URL 던지게 되면 오류가 날경우 빈 화면이 표출된다 

   이것은 location이 페이지를 로딩하여 불러오는 것이기 때문인데 이럴 경우를 대비해서 오류가 났었을 때 보여줄

   page를 제작하여 해당 페이지로 넘길 수 있도록 만들어준다.

   

   - 임시 방편으로는 ifram을 하나 만들어서 href속성을 넣어줘서 <iframe name="frmDownload"> 

     script에서 frmDownload.location.href = "download URL"; 을 실행시킨다. 

     그러면 iframe 태그가 현재 HTML에 다른 문서를 포함시킬때 사용하기 때문에 오류가 나더라도 

     iframe 안에 HTML이 불러와져서 페이지의 변동을 막을 수 있다.

728x90
반응형