zoukankan      html  css  js  c++  java
  • Java批量下载文件并zip打包

    客户需求:列表勾选需要的信息,点击批量下载文件的功能。这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求。以下是zip工具类:

    package test;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    import org.apache.tools.zip.ZipOutputStream;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    /**
     * 
     * 描述: ZipUtils.java
     * @author 小当家
     * @created 2017年10月27日 
     */
    public class ZipUtils {
        
        private static Logger logger = LoggerFactory.getLogger(ZipUtils.class);
        // 目录标识判断符
        private static final String PATCH = "/";
        // 基目录
        private static final String BASE_DIR = "";
        // 缓冲区大小
        private static final int BUFFER = 2048;
        // 字符集
        private static final String CHAR_SET = "GBK";
        
        
        /**
         * 
         * 描述: 压缩文件
         * @author 小当家
         * @created 2017年10月27日 
         * @param fileOutName
         * @param files
         * @throws Exception
         */
        public static void compress(String fileOutName, List<File> files) throws Exception {
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(fileOutName);
                ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
                zipOutputStream.setEncoding(CHAR_SET);
                
                if (files != null && files.size() > 0) {
                    for (int i = 0,size = files.size(); i < size; i++) {
                        compress(files.get(i), zipOutputStream, BASE_DIR);
                    }
                }
                // 冲刷输出流
                zipOutputStream.flush();
                // 关闭输出流
                zipOutputStream.close();
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
        
        /**
         * 
         * 描述:压缩文件并进行Base64加密
         * @author 小当家
         * @created 2017年10月27日 
         * @param files
         * @return
         * @throws Exception
         */
        public static String compressToBase64(List<File> files) throws Exception {
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
                zipOutputStream.setEncoding(CHAR_SET);
                
                if (files != null && files.size() > 0) {
                    for (int i = 0,size = files.size(); i < size; i++) {
                        compress(files.get(i), zipOutputStream, BASE_DIR);
                    }
                }
                // 冲刷输出流
                zipOutputStream.flush();
                // 关闭输出流
                zipOutputStream.close();
                
                byte[] data = bos.toByteArray();
                return new String(Base64.encodeBase64(data));
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
       /**
        * 
        * 描述: 压缩
        * @author 小当家
        * @created 2017年10月27日 
        * @param srcFile
        * @param zipOutputStream
        * @param basePath
        * @throws Exception
        */
        public static void compress(File srcFile, ZipOutputStream zipOutputStream, String basePath) throws Exception {
            if (srcFile.isDirectory()) {
                compressDir(srcFile, zipOutputStream, basePath);
            } else {
                compressFile(srcFile, zipOutputStream, basePath);
            }
        }
        
        /**
         * 
         * 描述:压缩目录下的所有文件
         * @author 小当家
         * @created 2017年10月27日 
         * @param dir
         * @param zipOutputStream
         * @param basePath
         * @throws Exception
         */
        private static void compressDir(File dir, ZipOutputStream zipOutputStream, String basePath) throws Exception {
            try {
                // 获取文件列表
                File[] files = dir.listFiles();
                
                if (files.length < 1) {
                    ZipEntry zipEntry = new ZipEntry(basePath + dir.getName() + PATCH);
                    
                    zipOutputStream.putNextEntry(zipEntry);
                    zipOutputStream.closeEntry();
                }
                
                for (int i = 0,size = files.length; i < size; i++) {
                    compress(files[i], zipOutputStream, basePath + dir.getName() + PATCH);
                }
            } catch (Exception e) {
                throw new Exception(e.getMessage(), e);
            }
        }
        
       /**
        * 
        * 描述:压缩文件
        * @author 小当家
        * @created 2017年10月27日 
        * @param file
        * @param zipOutputStream
        * @param dir
        * @throws Exception
        */
        private static void compressFile(File file, ZipOutputStream zipOutputStream, String dir) throws Exception {
            try {
                // 压缩文件
                ZipEntry zipEntry = new ZipEntry(dir + file.getName());
                zipOutputStream.putNextEntry(zipEntry);
                
                // 读取文件
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                
                int count = 0;
                byte data[] = new byte[BUFFER];
                while ((count = bis.read(data, 0, BUFFER)) != -1) {
                    zipOutputStream.write(data, 0, count);
                }
                bis.close();
                zipOutputStream.closeEntry();
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
        /**
         * 
         * 描述: 文件Base64加密
         * @author 小当家
         * @created 2017年10月27日 上午9:27:38
         * @param srcFile
         * @return
         * @throws Exception
         */
        public static String encodeToBASE64(File srcFile) throws Exception {
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                // 读取文件
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
                
                int count = 0;
                byte data[] = new byte[BUFFER];
                while ((count = bis.read(data, 0, BUFFER)) != -1) {
                    bos.write(data, 0, count);
                }
                bis.close();
                
                byte[] base64Data = Base64.encodeBase64(bos.toByteArray());
                if (null == base64Data) {
                    bos.close();
                    return null;
                }
                
                bos.close();
                return new String(base64Data, CHAR_SET);
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
        /**
         * 
         * 描述: 文件Base64解密
         * @author 小当家
         * @created 2017年10月27日 
         * @param destFile
         * @param encodeStr
         * @throws Exception
         */
        public static void decodeToBase64(File destFile, String encodeStr) throws Exception {
            try {
                byte[] decodeBytes = Base64.decodeBase64(encodeStr.getBytes());
                
                ByteArrayInputStream bis = new ByteArrayInputStream(decodeBytes);
                // 读取文件
                FileOutputStream fileOutputStream = new FileOutputStream(destFile);
                
                int count = 0;
                byte data[] = new byte[BUFFER];
                while ((count = bis.read(data, 0, BUFFER)) != -1) {
                    fileOutputStream.write(data, 0, count);
                }
                fileOutputStream.close();
                bis.close();
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
        /**
         * 
         * 描述: 解压缩
         * @author 小当家
         * @created 2017年10月27日 
         * @param srcFileName
         * @param destFileName
         * @throws Exception
         */
        @SuppressWarnings("unchecked")
        public static void decompress(String srcFileName, String destFileName)  throws Exception {
            try {
                ZipFile zipFile = new ZipFile(srcFileName);
                Enumeration<ZipEntry> entries = zipFile.getEntries();
                File destFile = new File(destFileName);
                InputStream inputStream = null;
                
                while(entries.hasMoreElements()) {
                    ZipEntry zipEntry = (ZipEntry)entries.nextElement(); 
                    String dir = destFile.getPath() + File.separator + zipEntry.getName();
                    File dirFile = new File(dir);
                    
                    if (zipEntry.isDirectory()) {
                        dirFile.mkdirs();
                    } else {
                        fileProber(dirFile);
                        inputStream = zipFile.getInputStream(zipEntry);
                        decompressFile(dirFile, inputStream);
                    }
                }
                zipFile.close();
            } catch (Exception e) {
                throw new Exception(e.getMessage(),e);
            }
        }
        
        /**
         * 
         * 描述: 解压文件
         * @author 小当家
         * @created 2017年10月27日 
         * @param destFile
         * @param inputStream
         * @throws Exception
         */
        private static void decompressFile(File destFile, InputStream inputStream) throws Exception {
            try {
                // 文件输入流
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
                
                int count = 0;
                byte data[] = new byte[BUFFER];
                while ((count = inputStream.read(data, 0, BUFFER)) != -1) {
                    bos.write(data, 0, count);
                }
                bos.close();
                inputStream.close();
            } catch (Exception e) {
                throw new Exception(e.getMessage(), e);
            }
        }
        
        /**
         * 
         * 描述:文件探测
         * @author 小当家
         * @created 2017年10月27日 
         * @param dirFile
         */
        private static void fileProber(File dirFile) {  
            File parentFile = dirFile.getParentFile();  
            if (!parentFile.exists()) {  
                // 递归寻找上级目录  
                fileProber(parentFile);  
                parentFile.mkdir();  
            }
        }
        public static void main(String[] args) {
            try {
                ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(new File("D:/a/a.zip")));
                zipOutputStream.setEncoding(CHAR_SET);
                
                List<File> files = new ArrayList<File>();
                files.add(new File("D:/a/1.xls"));
                files.add(new File("D:/a/2.xls"));
                files.add(new File("D:/a/1.java"));
                
                if (CollectionUtils.isEmpty(files) == false) {
                    for (int i = 0,size = files.size(); i < size; i++) {
                        compress(files.get(i), zipOutputStream, BASE_DIR);
                    }
                }
                // 冲刷输出流
                zipOutputStream.flush();
                // 关闭输出流
                zipOutputStream.close();    
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
    }

     所需要的jar包:

    ant-1.9.4.jar
    commons-codec-1.10.jar
    commons-collections-3.2.2.jar
    log4j-1.2.17.jar
    slf4j-api-1.7.21.jar
    slf4j-log4j12-1.7.21.jar

     例子中最后会压缩成一个a.zip如图:

    DEMO下载地址:https://dwz.cn/Jw3z6fVq 

  • 相关阅读:
    小白的linux笔记3:对外联通——开通ssh和ftp和smb共享
    小白的linux笔记2:关于进程的基本操作
    小白的linux笔记1:CentOS 8 安装与设置
    Python+Flask+MysqL的web技术建站过程
    管理信息系统 第三部分 作业
    数据迁移
    模型分离(选做)
    密码保护
    实现搜索功能
    完成个人中心—导航标签
  • 原文地址:https://www.cnblogs.com/xproer/p/10794221.html
Copyright © 2011-2022 走看看