Java实现Zip压缩文件并可以下载

1、项目需求:将多个文件打包后,放到本地,提供下载的需求。

2、实现思路:使用org.apache.tools.zip.ZipOutputStream。

3、实现代码:

(1)做一个压缩的工具类

package com.thinkgem.jeesite.modules.data.utils;

import java.io.BufferedInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.zip.CRC32;  
import java.util.zip.CheckedOutputStream;  
import java.util.zip.ZipEntry;  
import java.util.zip.ZipOutputStream;  
 
public class ZipCompressor {     
   static final int BUFFER = 8192;     
   
   private File zipFile;     
     
   public ZipCompressor(String pathName) {     
       zipFile = new File(pathName);     
   }     
   public void compress(String... pathName) {   
       ZipOutputStream out = null;     
       try {    
           FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
           CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,     
                   new CRC32());     
           out = new ZipOutputStream(cos);     
           String basedir = "";   
           for (int i=0;i<pathName.length;i++){  
               compress(new File(pathName[i]), out, basedir);     
           }  
           out.close();    
       } catch (Exception e) {     
           throw new RuntimeException(e);     
       }   
   }     
   public void compress(String srcPathName) {     
       File file = new File(srcPathName);     
       if (!file.exists())     
           throw new RuntimeException(srcPathName + "不存在!");     
       try {     
           FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
           CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,     
                   new CRC32());     
           ZipOutputStream out = new ZipOutputStream(cos);     
           String basedir = "";     
           compress(file, out, basedir);     
           out.close();     
       } catch (Exception e) {     
           throw new RuntimeException(e);     
       }     
   }     
   
   private void compress(File file, ZipOutputStream out, String basedir) {     
       /* 判断是目录还是文件 */    
       if (file.isDirectory()) {     
           System.out.println("压缩:" + basedir + file.getName());     
           this.compressDirectory(file, out, basedir);     
       } else {     
           System.out.println("压缩:" + basedir + file.getName());     
           this.compressFile(file, out, basedir);     
       }     
   }     
   
   /** 压缩一个目录 */    
   private void compressDirectory(File dir, ZipOutputStream out, String basedir) {     
       if (!dir.exists())     
           return;     
   
       File[] files = dir.listFiles();     
       for (int i = 0; i < files.length; i++) {     
           /* 递归 */    
           compress(files[i], out, basedir + dir.getName() + "/");     
       }     
   }     
   
   /** 压缩一个文件 */    
   private void compressFile(File file, ZipOutputStream out, String basedir) {     
       if (!file.exists()) {     
           return;     
       }     
       try {     
           BufferedInputStream bis = new BufferedInputStream(     
                   new FileInputStream(file));     
           ZipEntry entry = new ZipEntry(basedir + file.getName());     
           out.putNextEntry(entry);     
           int count;     
           byte data[] = new byte[BUFFER];     
           while ((count = bis.read(data, 0, BUFFER)) != -1) {     
               out.write(data, 0, count);     
           }     
           bis.close();     
       } catch (Exception e) {     
           throw new RuntimeException(e);     
       }     
   }     
  public static void main(String[] args) {     
       ZipCompressor zc = new ZipCompressor("E:/resource/resource.zip");     
       zc.compress("E:/resource/js","E:/resource/css","E:/resource/images");    
   }  
}   

(2)调用该类

        //存放Zip文件的路径
        String path = fileRoot + productService.getCode() + productService.getTypeCode() + ".zip";
        
        File file = new File(path);
        if(!file.exists()) {//需要打包的多个文件的路径
            String[] str = (String[])strArray.toArray(new String[strArray.size()]);
            ZipCompressor zc = new  ZipCompressor(path);
            zc.compress(str);
        }

  (3)提供下载的方法

 @RequestMapping(value = "downLoadZipFile")
    public void estampDown(HttpServletRequest request, HttpServletResponse response) {  
     
        try {  
            String code = request.getParameter("code");
            String typeCode = request.getParameter("typeCode");
            String fileRoot = Global.getConfig("fileRoot");
            String path = fileRoot + code + typeCode + ".zip";
            
            File file = new File(path); // 要下载的文件绝对路径  
            InputStream ins;    

            ins = new BufferedInputStream(new FileInputStream(file));  

            byte[] buffer = new byte[ins.available()];  
            ins.read(buffer);  
            ins.close();  

            response.reset();  
            response.addHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes()));  
            response.addHeader("Content-Length", "" + file.length());  
            OutputStream ous = new BufferedOutputStream(response.getOutputStream());  
            response.setContentType("application/octet-stream");  
            ous.write(buffer);  
            ous.flush();  
            ous.close();  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

相关资料的链接(感谢):

https://blog.csdn.net/xinqiku/article/details/79656829

http://blog.163.com/shanqing_shuixiu@yeah/blog/static/165319229201192444434865/

猜你喜欢

转载自blog.csdn.net/qq_38676810/article/details/79780094