java 打包压缩包下载文件
1. 下载压缩包zip方法
@Override public void downloadZip(HttpServletResponse servletResponse) { String nowTime = DateUtil.DateToString(new Date(), DateStyle.YYYYMMDDHHMMSS); // 打包文件夹路径 String baseTempPath = "D:/downloads/zipDownTest/"; // 定义压缩包文件名 String zipFileName = "申请表" +".zip"; // 压缩 ZipCompress compress = new ZipCompress(zipFileName, baseTempPath); compress.zip(); // 获取压缩文件流 InputStream zipStream = new FileInputStream(new File(zipFileName)); // 下载文件名中文处理 String downZipFileName = URLEncoder.encode(zipFileName.substring(zipFileName.lastIndexOf("/") + 1), "UTF-8"); // 下载到浏览器 servletResponse.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + downZipFileName); BufferedOutputStream bufferedOs = new BufferedOutputStream(servletResponse.getOutputStream()); byte[] buffer = new byte[10240]; int bytesRead = 0; while ((bytesRead = zipStream.read(buffer)) != -1) { bufferedOs.write(buffer, 0, bytesRead); } bufferedOs.flush(); bufferedOs.close(); zipStream.close(); // 删除临时的打包文件目录和删除下载生成的临时压缩包 FileUtil.deleteDir(baseTempPath); new File(zipFileName).delete(); }
2.文件压缩工具类
package com.talebase.cloud.cas.util.zip; import lombok.extern.log4j.Log4j2; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 文件压缩工具类 */ @Log4j2 public class ZipCompress { private String zipFileName; // 目的地Zip文件 private String sourceFileName; // 源文件(带压缩的文件或文件夹) public ZipCompress(String zipFileName, String sourceFileName) { this.zipFileName = zipFileName; this.sourceFileName = sourceFileName; } public void zip() throws Exception { //File zipFile = new File(zipFileName); log.info("开始压缩中..."); long begin = System.currentTimeMillis(); //创建zip输出流 File zipFile = new File(zipFileName); if (!zipFile.exists()) { zipFile.createNewFile(); } ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); //创建缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(out); File sourceFile = new File(sourceFileName); //调用函数 compress(out, bos, sourceFile, sourceFile.getName()); bos.close(); out.close(); long currentTimeMillis = System.currentTimeMillis(); log.info(zipFileName + "压缩完成(100%)....." + (currentTimeMillis - begin) + "ms"); } public void zipNoDirectory() throws Exception { //File zipFile = new File(zipFileName); log.info("开始压缩中..."); long begin = System.currentTimeMillis(); //创建zip输出流 ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); //创建缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(out); File sourceFile = new File(sourceFileName); if (sourceFile.isDirectory()) { File[] flist = sourceFile.listFiles(); for (int i = 0; i < flist.length; i++) { compress(out, bos, flist[i], flist[i].getName()); } } //调用函数 // compress(out,bos,sourceFile,sourceFile.getName()); bos.close(); out.close(); long currentTimeMillis = System.currentTimeMillis(); log.info(zipFileName + "压缩完成(100%)....." + (currentTimeMillis - begin) + "ms"); } public void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception { //如果路径为目录(文件夹) if (sourceFile.isDirectory()) { //取出文件夹中的文件(或子文件夹) File[] flist = sourceFile.listFiles(); if (flist.length == 0) {//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点 //System.out.println("空:******"+base+"/"); out.putNextEntry(new ZipEntry(base + File.separator)); } else {//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩 for (int i = 0; i < flist.length; i++) { compress(out, bos, flist[i], base + "/" + flist[i].getName()); } } } else {//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中 out.putNextEntry(new ZipEntry(base)); FileInputStream fos = new FileInputStream(sourceFile); BufferedInputStream bis = new BufferedInputStream(fos); int tag; // System.out.println(base); //将源文件写入到zip文件中 while ((tag = bis.read()) != -1) { bos.write(tag); } bos.flush(); bis.close(); fos.close(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!