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实现读取resources目录下的文件路径的九种方式

    Java实现读取resources目录下的文件路径的九种方式

    本文主要介绍了Java实现读取resources目录下的文件路径的九种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • java编程之基于SpringBoot框架实现扫码登录

    java编程之基于SpringBoot框架实现扫码登录

    本文将介绍基于SpringBoot + Vue + Android实现的扫码登录demo的总体思路,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • idea项目debug模式无法启动的解决

    idea项目debug模式无法启动的解决

    这篇文章主要介绍了idea项目debug模式无法启动的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 自定义类加载器以及打破双亲委派模型解析

    自定义类加载器以及打破双亲委派模型解析

    这篇文章主要介绍了自定义类加载器以及打破双亲委派模型解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java中Set&List的迭代器实现步骤解析

    Java中Set&List的迭代器实现步骤解析

    这篇文章主要介绍了Java中Set&List的迭代器实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java排序算法中的冒泡排序算法实现

    Java排序算法中的冒泡排序算法实现

    这篇文章主要介绍了Java排序算法中的冒泡排序算法实现,冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足就让它俩互换,需要的朋友可以参考下
    2023-12-12
  • Java利用JavaCPP调用算法示例

    Java利用JavaCPP调用算法示例

    本文主要介绍了Java利用JavaCPP调用算法示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java 单向队列及环形队列的实现原理

    Java 单向队列及环形队列的实现原理

    本文主要介绍了Java 单向队列及环形队列的实现原理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 使用FormData上传二进制文件、对象、对象数组方式

    使用FormData上传二进制文件、对象、对象数组方式

    这篇文章主要介绍了使用FormData上传二进制文件、对象、对象数组方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot中如何进行统一异常处理

    SpringBoot中如何进行统一异常处理

    大家好,本篇文章主要讲的是SpringBoot中如何进行统一异常处理,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论