Java实现导出ZIP压缩包的方法

 更新时间:2020年11月02日 11:37:30   作者:溪~源  
这篇文章主要介绍了Java实现导出ZIP压缩包的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

最近接触到一个需求要求压缩导出文件,于是乎便要致力于研究一下工具类啦,故也诞生了此篇文章。
下面代码中,溪源也将import导入的依赖也贴出来了,避免大家引入错误。

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author wx
 * @date 2020/10/29 5:19 下午
 */
public class FileZipUtil {

  private static void handlerFile(ZipOutputStream zip, File file, String dir) throws Exception {
    //如果当前的是文件夹,则进行进一步处理
    if (file.isDirectory()) {
      //得到文件列表信息
      File[] fileArray = file.listFiles();
      if (fileArray == null) {
        return;
      }
      //将文件夹添加到下一级打包目录
      zip.putNextEntry(new ZipEntry(dir + "/"));
      dir = dir.length() == 0 ? "" : dir + "/";
      //递归将文件夹中的文件打包
      for (File f : fileArray) {
        handlerFile(zip, f, dir + f.getName());
      }
    } else {
      //当前的是文件,打包处理
      //文件输入流
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
      ZipEntry entry = new ZipEntry(dir);
      zip.putNextEntry(entry);
      zip.write(FileUtils.readFileToByteArray(file));
      IOUtils.closeQuietly(bis);
      zip.flush();
      zip.closeEntry();
    }
  }

  private static byte[] createZip(String sourceFilePath) throws Exception{
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ZipOutputStream zip = new ZipOutputStream(outputStream);
    //将目标文件打包成zip导出
    File file = new File(sourceFilePath);
    handlerFile(zip, file,"");
    IOUtils.closeQuietly(zip);
    return outputStream.toByteArray();
  }


  public static void exportZip(HttpServletResponse response, String sourceFilePath) {
  //文件名以时间戳作为前缀
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    String filePrefix = sdf.format(new Date());
    String downloadName = filePrefix + ".zip";
    //将文件进行打包下载
    try {
      OutputStream out = response.getOutputStream();
      //接收压缩包字节
      byte[] data = createZip(sourceFilePath);
      response.reset();
      response.addHeader("Access-Control-Allow-Origin", "*");
      response.setHeader("Access-Control-Expose-Headers", "*");
      response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + downloadName);
      response.addHeader("Content-Length", "" + data.length);
      response.setContentType("application/octet-stream;charset=UTF-8");
      IOUtils.write(data, out);
      out.flush();
      out.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

客户端调用方法:

 @GetMapping("/exportFile")
  public Result exportFile(HttpServletResponse response) {
    //第二个参数为:要压缩文件的地址
    FileZipUtil.exportZip(response, "/Users/Downloads");
  }

到此这篇关于Java实现导出ZIP压缩包的方法的文章就介绍到这了,更多相关Java导出ZIP压缩包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java程序中实现调用Python脚本的方法详解

    Java程序中实现调用Python脚本的方法详解

    这篇文章主要介绍了Java程序中实现调用Python脚本的方法,结合实例形式分析了eclipse环境中使用Java调用Python脚本的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-03-03
  • Java使用异常链传递错误信息的详细指南

    Java使用异常链传递错误信息的详细指南

    作为一名Java开发者,相信你一定见过各种奇奇怪怪的异常报错,但有没有遇到过这样的情况:明明只调用了一个方法,却看到异常信息像俄罗斯套娃一样一层层展开?所以本文给大家介绍了Java异常链(Exception Chaining)机制,需要的朋友可以参考下
    2025-09-09
  • Java使用java -jar启动并按日分包日志的最佳实践

    Java使用java -jar启动并按日分包日志的最佳实践

    在生产环境中,Java应用程序通常以java -jar方式运行,而日志管理是运维的重要部分,如果日志文件过大,不仅影响性能,还会增加排查问题的难度,因此,按日分包日志成为常见的需求,本文将介绍4种实现方式,并提供详细配置和代码示例,需要的朋友可以参考下
    2025-07-07
  • JVM执行引擎和垃圾回收要点总结

    JVM执行引擎和垃圾回收要点总结

    不论是在问题现场还是跳槽面试,我们面对JVM性能问题,依旧会束手无辞,它需要你对Java虚拟机的实现和优化,有极为深刻的理解。所以我在这里整理了一下 JVM的知识点。今天说说虚拟机执行引擎和垃圾回收,都是十足的干货,请各位看官耐心批阅!
    2021-06-06
  • Java(enum)枚举用法详解

    Java(enum)枚举用法详解

    本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理。有兴趣的可以一起来了解一下。
    2016-11-11
  • Activiti进阶之组任务实现示例详解

    Activiti进阶之组任务实现示例详解

    这篇文章主要为大家介绍了Activiti进阶之组任务实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • java实现题目以及选项乱序的方法实例

    java实现题目以及选项乱序的方法实例

    这篇文章主要给大家介绍了关于java实现题目以及选项乱序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 对数据进行分页显示到table中的实现方法

    对数据进行分页显示到table中的实现方法

    这篇文章主要介绍了对数据进行分页显示到table中的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • SpringBoot异常: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext解决方案

    SpringBoot异常: nested exception is java.lang.NoClassDefFoundE

    这篇文章主要介绍了SpringBoot异常: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext解决方案,说明了错误原因和解决方案,需要的朋友可以参考下
    2021-06-06
  • springboot配置https安全连接的方法

    springboot配置https安全连接的方法

    这篇文章主要介绍了springboot配置https安全连接的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论