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

作者:溪~源 时间:2023-05-06 04:58:57 

最近接触到一个需求要求压缩导出文件,于是乎便要致力于研究一下工具类啦,故也诞生了此篇文章。
下面代码中,溪源也将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");
 }

来源:https://blog.csdn.net/xuan_lu/article/details/109437417

标签:Java,ZIP,压缩包
0
投稿

猜你喜欢

  • Android广播接收机制详细介绍(附短信接收实现)

    2023-04-16 10:09:57
  • Android之RecyclerView轻松实现下拉刷新和加载更多示例

    2021-09-06 06:14:40
  • Flutter实现自定义搜索框AppBar的示例代码

    2021-10-26 02:37:54
  • 简单介绍Android开发中的Activity控件的基本概念

    2022-02-23 23:46:21
  • java基于AES对称加密算法实现的加密与解密功能示例

    2023-02-07 13:34:47
  • Java图形用户界面设计(Swing)的介绍

    2022-08-23 03:29:37
  • 什么是递归?用Java写一个简单的递归程序

    2022-02-11 19:39:45
  • C#中sleep和wait的区别分析

    2021-09-11 08:31:25
  • java动态线程池的简单实现思路

    2023-10-18 15:53:46
  • Java流处理stream使用详解

    2021-09-17 18:27:58
  • mybatis日志打印的两款IDEA插件推荐

    2022-01-12 07:55:52
  • Android 通过SQLite数据库实现数据存储管理

    2023-09-28 11:31:59
  • Unity3D撤回命令开发详解

    2022-01-15 09:26:21
  • 对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    2023-08-19 02:37:19
  • Java新手环境搭建 Tomcat安装配置教程

    2021-08-19 08:06:23
  • Android实现手机多点触摸画圆

    2022-03-23 06:23:16
  • Mybatis-plus全局id生成策略详解

    2022-11-30 02:41:21
  • 关于使用Mybatisplus自带的selectById和insert方法时的一些问题

    2023-11-01 14:15:42
  • SpringMVC实现数据绑定及表单标签

    2022-03-24 18:06:47
  • C#实现的算24点游戏算法实例分析

    2021-12-01 04:13:21
  • asp之家 软件编程 m.aspxhome.com