025下载文件夹打包zip

pp一.调用主方法填入参数

/**
  *stayPath:压缩文件地址
  *compressPath:压缩后存储地址
  *true/false:是否在压缩文件里创建目录,仅在压缩文件为目录时有效,如果为false,将直接压缩目录下文件            
  *            到压缩文件. 
  *passwd:压缩使用的密码
  ***/
  ZipUtil.zip( stayPath,compressPath,true,passwd);
 

二.引入pom文件

<dependency>
            <groupId>net.lingala</groupId>
            <artifactId>zip4j</artifactId>
            <version>1.3.3</version>
</dependency>



三.压缩主要方法

package cn.com.goldwind.ercp.fems.business.deliverables.service;
import java.io.File;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import org.apache.commons.lang3.StringUtils;

/**
 * 压缩文件夹成zip格式
 *
 * */
public class ZipUtil {
	   /** 
	     * 使用给定密码压缩指定文件或文件夹到指定位置. 
	     * <p> 
	     * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".<br /> 
	     * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;<br /> 
	     * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. 
	     * @param src 要压缩的文件或文件夹路径 
	     * @param dest 压缩文件存放路径 
	     * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br /> 
	     * 如果为false,将直接压缩目录下文件到压缩文件. 
	     * @param passwd 压缩使用的密码 
	     * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. 
	     */
	public static String zip(String src, String dest, boolean isCreateDir, String passwd) throws Exception {
	    File srcFile = new File(src);
	    dest = buildDestinationZipFilePath(srcFile, dest);
	    ZipParameters parameters = new ZipParameters();
	    parameters.setCompressionMethod(8);
	    parameters.setCompressionLevel(5);
	    if (!StringUtils.isEmpty(passwd)) {
	      parameters.setEncryptFiles(true);
	      parameters.setEncryptionMethod(0);
	      parameters.setPassword(passwd.toCharArray());
	    } 
	    try {
	      ZipFile zipFile = new ZipFile(dest);
	      if (srcFile.isDirectory()) {
	        if (!isCreateDir) {
	          File[] subFiles = srcFile.listFiles();
	          if (subFiles != null && subFiles.length > 0)
	            for (File f : subFiles) {
	              if (f.isDirectory()) {
	                zipFile.addFolder(f, parameters);
	              } else {
	                zipFile.addFile(f, parameters);
	              } 
	            }  
	          return dest;
	        } 
	        zipFile.addFolder(srcFile, parameters);
	      } else {
	        zipFile.addFile(srcFile, parameters);
	      } 
	    } catch (ZipException e) {
	      throw e;
	    } 
	    return dest;
	  }
	
	 private static String buildDestinationZipFilePath(File srcFile, String destParam) {
		    if (StringUtils.isEmpty(destParam)) {
		      if (srcFile.isDirectory()) {
		        destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";
		      } else {
		        String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
		        destParam = srcFile.getParent() + File.separator + fileName + ".zip";
		      } 
		    } else {
		      createDestDirectoryIfNecessary(destParam);
		      if (destParam.endsWith(File.separator)) {
		        String fileName = "";
		        if (srcFile.isDirectory()) {
		          fileName = srcFile.getName();
		        } else {
		          fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
		        } 
		        destParam = destParam + fileName + ".zip";
		      } 
		    } 
		    return destParam;
		  }
	  private static void createDestDirectoryIfNecessary(String destParam) {
		    File destDir = null;
		    if (destParam.endsWith(File.separator)) {
		      destDir = new File(destParam);
		    } else {
		      destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));
		    } 
		    if (!destDir.exists())
		      destDir.mkdirs(); 
		  }
}

四.下载

 /**
   * 导出名称:交付物文件.zip
   * 文件地址:compressPath + "交付物文件.zip"
   * */
  this.outputStream(response,"交付物文件.zip",compressPath + "交付物文件.zip");

五.导出文件

/**
     * 导出文件
     * @param response
     * @param fileName:导出附件名称
     * @param filePath:导出附件目标地址
     */
    private void outputStream(HttpServletResponse response, String fileName, String filePath) {
        BufferedInputStream br = null;
        BufferedOutputStream out = null;
        try {
            // 将excel放入输出流推出
            OutputStream os = response.getOutputStream();
            out = new BufferedOutputStream(os);
            // fileDownload插件以此判断下载是否成功,不设置则不执行成功回调函数
            response.setHeader("Set-Cookie", "fileDownload=true; path=/");
            // 设置文件类型
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/zip");
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
            //读取文件
            br = new BufferedInputStream(new FileInputStream(new File(filePath)));
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = br.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    logger.error("zip文件流读取失败:", e.getMessage());
                }
            }
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    logger.error("输出流关闭失败:", e.getMessage());
                }
            }
        }
    }

六.文件删除、文件夹删除

// 删除临时文件
this.delFile(fileCre);

// 删除临时文件.zip
File fileZip = new File(fasConstant.getValue(FasConstant.FILEPATH) + "交付物文件.zip");


    /***
     * 删除文件夹下所有文件(包括子目录内的文件)
     */
    public static boolean delFile(File file) {
        //判断文件不为null或文件目录存在
        if (file == null || !file.exists()) {
            System.out.println("文件删除失败,请检查文件路径是否正确");
            return false;
        }
        //取得这个目录下的所有子文件对象
        File[] files = file.listFiles();
        //遍历该目录下的文件对象
        for (File f : files) {
            //打印文件名
            String name = file.getName();
            System.out.println(name);
            //判断子目录是否存在子目录,如果是文件则删除
            if (f.isDirectory()) {
                delFile(f);
            } else {
                f.delete();
            }
        }
        //删除空文件夹  for循环已经把上一层节点的目录清空。
        return file.delete();
    }


版权声明:本文为mh99124f原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。