IT정보사전

[JAVA] 파일 ZIP압축 및 다운로드(ZipOutputStream) 본문

웹 프로그래밍

[JAVA] 파일 ZIP압축 및 다운로드(ZipOutputStream)

작은나무0530 2020. 4. 23. 18:20
728x90
반응형

안녕하세요~ 작은나무입니다!!
오늘은 여러개의 업로드된 파일을 ZIP파일로 압축 후 다운로드까지 되는 부분을 정리해 보도록 하겠습니다.
java.util.zip 패키지를 이용해서 파일 압축하는 코드를 작성해 보겠습니다.

[소스구현 - Class]

public void CompressZIP(HttpServletRequest request, HttpServletResponse response, Object handler) {
	String[] files = { "file1.pdf", "file2.jpg", "file3.txt" };

	ZipOutputStream zout = null;
	String zipName = "CompressionFile.zip";		//ZIP 압축 파일명
	String tempPath = "";

	if (files.length > 0) {
          try{
             tempPath = "/temp/";		//ZIP 압축 파일 저장경로
             
             //ZIP파일 압축 START
             zout = new ZipOutputStream(new FileOutputStream(tempPath + zipName));
             byte[] buffer = new byte[1024];
             FileInputStream in = null;
             
             for ( int k=0; k<files.length; k++){
                in = new FileInputStream("/temp/" + files[k]);		//압축 대상 파일
                zout.putNextEntry(new ZipEntry(files[k]));	//압축파일에 저장될 파일명
                
                int len;
                while((len = in.read(buffer)) > 0){
                   zout.write(buffer, 0, len);			//읽은 파일을 ZipOutputStream에 Write
                }
                
                zout.closeEntry();
                in.close();
             }
             
             zout.close();
             //ZIP파일 압축 END
             
             //파일다운로드 START
             response.setContentType("application/zip");
             response.addHeader("Content-Disposition", "attachment;filename=" + zipName);
             
             FileInputStream fis = new FileInputStream(tempPath + zipName);
             BufferedInputStream bis = new BufferedInputStream(fis);
             ServletOutputStream so = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(so);
             
             int n = 0;
             while((n = bis.read(buffer)) > 0){
                bos.write(buffer, 0, n);
                bos.flush();
             }
             
             if(bos != null) bos.close();
             if(bis != null) bis.close();
             if(so != null) so.close();
             if(fis != null) fis.close();
             //파일다운로드 END
          }catch(IOException e){
             //Exception
          }finally{
             if (zout != null){
                zout = null;
             }
          }
	}
}

코드 작성 후 Local 테스트 진행을 해보니 압축 및 다운로드 기능 정상 동작 확인 후 서버에 반영했는대요~
압축 속도가 엄청 오래 걸리는 거에요;;; 왜 그런가 했더니...
파일서버가 NFS로 설정되어 있는 폴더로 지정을 했더니 Write 속도가 안나오고, Storage서버로 경로를 변경하였더니 아주 잘 동작하네요^^;

728x90
반응형
그리드형
Comments