본문 바로가기

Java

[java]파일 여러개 압축 후 다운로드

하나의 HTTP 요청에 대해 여러개의 파일 일괄다운로드를 제공할 수 없어서
파일을 압축 후 다운로드 제공.


String zipFile = "E:/test.zip";
String downloadFileName = "result";

List<String> sourceFiles = new ArrayList<String>();
sourceFiles.add("E:/file1.txt");
sourceFiles.add("E:/file2.txt");
sourceFiles.add("E:/file3.txt");

try{

    // ZipOutputStream을 FileOutputStream 으로 감쌈
    FileOutputStream fout = new FileOutputStream(zipFile);
    ZipOutputStream zout = new ZipOutputStream(fout);

    for(int i=0; i < sourceFiles.size(); i++){

        //본래 파일명 유지, 경로제외 파일압축을 위해 new File로 
        ZipEntry zipEntry = new ZipEntry(new File(sourceFiles.get(i)).getName());
        zout.putNextEntry(zipEntry);

        //경로포함 압축
        //zout.putNextEntry(new ZipEntry(sourceFiles.get(i)));

        FileInputStream fin = new FileInputStream(sourceFiles.get(i));
        byte[] buffer = new byte[1024];
        int length;

        // input file을 1024바이트로 읽음, zip stream에 읽은 바이트를 씀
        while((length = fin.read(buffer)) > 0){
            zout.write(buffer, 0, length);
        }

        zout.closeEntry();
        fin.close();
    }

    zout.close();

    response.setContentType("application/zip");
    response.addHeader("Content-Disposition", "attachment; filename=" + downloadFileName + ".zip");

    FileInputStream fis=new FileInputStream(zipFile);
    BufferedInputStream bis=new BufferedInputStream(fis);
    ServletOutputStream so=response.getOutputStream();
    BufferedOutputStream 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();

    } catch(IOException ioe){ }