前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【工具类】多文件压缩下载ZipUtil

【工具类】多文件压缩下载ZipUtil

作者头像
周杰伦本人
发布2022-10-25 16:10:40
5120
发布2022-10-25 16:10:40
举报
文章被收录于专栏:同步文章

ZipUtil

代码语言:javascript
复制
import java.io.*;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;

/**
 * 生成压缩文件工具类
 * @author 
 *
 */
public final class ZipUtil {

	private static Logger logger = LoggerFactory.getLogger(ZipUtil.class);
	/**
	 * 字节数组长度
	 */
	private static final int BYTE_ARRAY_LENGTH = 1024;
    
    
    private ZipUtil(){
        throw new IllegalStateException("ZipUtil class");
    }
    
	/**
	 * 创建目标路径中文件夹
	 * @param folderName 路径
	 * @return 创建结果
	 */
	public static boolean makeDirs(String folderName) {
		if (folderName == null || folderName.isEmpty()) {
			return false;
		}
		File folder = new File(folderName);
		return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
	}
	
	 /**
	  * 创建压缩文件  
	  * @param srcfile 源文件列表
	  * @param zipfile 压缩文件
	 * @throws IOException io异常
	  */
    public static void zipFiles(File[] srcfile, File zipfile) throws IOException {  
        byte[] buf = new byte[BYTE_ARRAY_LENGTH];  
        ZipOutputStream out =  null;
        FileInputStream in = null;
        try {  
        	out = new ZipOutputStream(new FileOutputStream(  
                    zipfile));  
            for (int i = 0; i < srcfile.length; i++) {
                try{
					in = new FileInputStream(srcfile[i]);  
					out.putNextEntry(new ZipEntry(srcfile[i].getName()));  
					// 支持中文  解决文件名乱码问题
		            out.setEncoding("GBK");
					int len;  
					while ((len = in.read(buf)) > 0) {
					    out.write(buf, 0, len);  
					}
                }	
				catch (Exception e) {
				    logger.error(String.format("压缩文件出错 01:{}%s", e));
                }
				finally{
				    out.closeEntry();
				    in.close();
				}
            }  
        } catch (IOException e) {  
            logger.error(String.format("压缩文件出错 02:{}%s", e));
        }finally{
        	out.close();
        }
    } 
    
    /**
     * 从浏览器下载压缩文件
     * @param file 文件对象
     * @param response 响应对象
     * @param isDelete 是否删除源文件
     * @throws IOException io异常
     */
    public static void downloadZipFile(File file,HttpServletResponse response,boolean isDelete) throws IOException{
    	OutputStream toClient = null;
//		InputStream inputStream = null;
    	 try(InputStream inputStream =new FileInputStream(file);) {

             // 清空response
             response.reset();
             toClient = new BufferedOutputStream(response.getOutputStream());
//			 inputStream=new FileInputStream(file);
			 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
			 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(),"UTF-8"));
			 int len=0;
			 byte[] buffer=new byte[1024];
			 while((len=inputStream.read(buffer))>0){
				 toClient.write(buffer,0,len);
			 }
             toClient.flush();
          } catch (IOException ex) {
              logger.error(ex.getMessage());
         }
    	 finally{
        	 if(toClient!= null){
        		 toClient.close();
        	 }
//			 if(inputStream!= null){
//				 inputStream.close();
//			 }

         }
    	 //在所有流都关闭后再删除文件
        if(isDelete&&file.exists()&&(!file.delete())) {//是否将生成的服务器端文件删除
//            if (file.exists()) {
//                if (!file.delete()){
                    logger.error("删除失败");
//                }
//            }

        }
	}
}

使用实例:

代码语言:javascript
复制
				//多个文件下载,需要压缩
                //导出文件路径
                String filePath = System.getProperty("catalina.base") + File.separator + "tmp\\"+getCurrentUser().getLoginId()+"\\";
                //创建此路径
                ZipUtil.makeDirs(filePath);
                //得到此路径下文件
                File fileDir = new File(filePath);
                File[] fileDirs = fileDir.listFiles();
                this.deleteFile(fileDirs);
                //导出Excel文件路径
                String fullFilePath = "";
                //用于存放生成的excel文件名称
                List<String> fileNameforexcel = new ArrayList<String>();
                //导出压缩文件路径
                String zipFilePath = "";
                //导出压缩文件的全路径
                String zipname = this.getZipName(pglx);
                zipFilePath = filePath + File.separator + zipname + ".zip";
                File zip = new File(zipFilePath);//创建压缩文件
                //保存文件名
                //String fileName = "";
                //FileOutputStream os = null;
                for (int i = 0; i < pgbgBeans.size(); i++) {
                    PgbgBean pgbgBean = pgbgBeans.get(i);
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("pgjgzs", pgbgBean);
                    try {
                        String fileNametemp = "("+String.valueOf(i+1)+")"
                                +ExcelUtils.exportInspectionRecordSurface(request, response, map,pglx);
                        ExcelUtils.writeExcelTolocal(fileNametemp+".xls", filePath);
                        fullFilePath = filePath+fileNametemp+".xls";
                        fileNameforexcel.add(fullFilePath);
                    } catch (Exception e) {
                    	log.error("批量文件下载异常", e);
                    }
                }

                //将excel文件生成压缩文件
                File[] srcfile = new File[fileNameforexcel.size()];
                for (int j = 0, n1 = fileNameforexcel.size(); j < n1; j++) {
                    srcfile[j] = new File(fileNameforexcel.get(j));
                }
                try {
                    ZipUtil.zipFiles(srcfile, zip);
                } catch (IOException e) {
                	log.error("生成压缩文件异常", e);
                }

                File file = new File(zipFilePath);
                try {
                    ZipUtil.downloadZipFile(file, response, true);
                } catch (IOException e) {
                	log.error("压缩文件下载异常", e);
                }

ExcelUtils.writeExcelTolocal方法

代码语言:javascript
复制
/**
     * 将excel导出到本地
     * @param fileName 文件名
     * @param pathname 路径名
     * @throws IOException io异常
     */
    public static void writeExcelTolocal(String fileName, String pathname) throws IOException {
        OutputStream out = null;
        try {
            out = new FileOutputStream(new File(pathname + fileName));
            workbook.write(out);
            //byte[] bytes = new byte[1024];
            //out.write(bytes, 0, bytes.length);
            out.flush();
        } catch (FileNotFoundException e) {
            logger.error("导出到本地文件不存在", e);
        } catch (IOException e) {
            logger.error("文件导出到本地异常", e);
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档