Java implements Zip compressed files and can download

1. Project requirements: After packaging multiple files, put them locally to provide download requirements.

2. Implementation ideas: use org.apache.tools.zip.ZipOutputStream.

3. Implementation code:

(1) Make a compressed tool class

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) {     
       /* Determine whether it is a directory or a file*/    
       if (file.isDirectory()) {     
           System.out.println("Compression:" + basedir + file.getName() );     
           this.compressDirectory(file, out, basedir);     
       } else {     
           System.out.println("Compression: " + basedir + file.getName());     
           this.compressFile(file, out, basedir);     
       }     
   }     
   
   / ** Compress a directory*/    
   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) call the class

        //The path to store the Zip file
        String path = fileRoot + productService.getCode() + productService.getTypeCode() + ".zip";
        
        File file = new File(path);
        if(!file.exists()) {// Path to multiple files to be packed
            String[] str = (String[])strArray.toArray(new String[strArray.size()]);
            ZipCompressor zc = new ZipCompressor(path);
            zc.compress(str);
        }

  (3) Provide a method for downloading

 @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();  
        }  
    }

Links to related materials (thanks):

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

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325912116&siteId=291194637