SpringBoot将多个文件夹进行压缩的两种方法(浏览器下载和另存为)
作者:一纸红尘轻似梦
Spring Boot项目通常不会自动对文件夹进行压缩,不过,在打包应用时,如果你使用了Maven或Gradle这样的构建工具,并且配置了相应的插件,可以在打成jar或war包的时候将依赖的库文件合并并压缩,本文介绍了SpringBoot将多个文件夹进行压缩的两种方法
1、将多个文件夹压缩成一个压缩包(压缩到固定目录)
import java.io.*; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class FileZipper { public static void main(String[] args) { // 示例使用 String zipFilePath = "C:\\Users\\guohu\\Desktop\\archive.zip"; List<File> fileList = List.of( new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039746"), new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039747"), new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039748") ); // 将文件列表压缩成压缩包 boolean result = zipFiles(fileList, zipFilePath); if (result) { System.out.println("文件压缩成功: " + zipFilePath); } else { System.out.println("压缩文件失败"); } } public static boolean zipFiles(List<File> fileList, String zipFilePath) { try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { for (File file : fileList) { if (file.exists()) { compress(file, zos, file.getName(), true); } } return true; } catch (IOException e) { e.printStackTrace(); return false; } } private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws IOException { byte[] buffer = new byte[4096]; if (sourceFile.isFile()) { try (FileInputStream fis = new FileInputStream(sourceFile)) { ZipEntry zipEntry; if (KeepDirStructure) { zipEntry = new ZipEntry(name); } else { zipEntry = new ZipEntry(sourceFile.getName()); } zos.putNextEntry(zipEntry); int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); } } else if (sourceFile.isDirectory()) { File[] files = sourceFile.listFiles(); if (files != null) { for (File file : files) { if (KeepDirStructure) { compress(file, zos, name + File.separator + file.getName(), KeepDirStructure); } else { compress(file, zos, file.getName(), KeepDirStructure); } } } } } }
2、将多个文件夹压缩成一个压缩包(通过浏览器下载)
List<File> fileList = Arrays.asList( new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039746"), new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039747"), new File("C:\\Users\\guohu\\Desktop\\新建文件夹 (8)\\1657269583419039748") ); zipFiles(fileList, response,"学生资料"); /** * 多个文件压缩成压缩包并下载工具类 * * @param fileList * @param */ public static void zipFiles(List<File> fileList, HttpServletResponse response, String zipFileName) { try { // 设置响应的头部信息 response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFileName+".zip", "utf-8")); // 设置响应内容的类型 response.setContentType("application/octet-stream"); // 将压缩文件写入输出流 try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { for (File file : fileList) { if (file.exists()) { compress(file, zos, file.getName(), true); } } } response.flushBuffer(); response.getOutputStream().close(); } catch (IOException e) { e.printStackTrace(); } } private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean keepDirStructure) throws IOException { byte[] buffer = new byte[4096]; if (sourceFile.isFile()) { try (FileInputStream fis = new FileInputStream(sourceFile)) { ZipEntry zipEntry; if (keepDirStructure) { zipEntry = new ZipEntry(name); } else { zipEntry = new ZipEntry(sourceFile.getName()); } zos.putNextEntry(zipEntry); int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); } } else if (sourceFile.isDirectory()) { File[] files = sourceFile.listFiles(); if (files != null) { for (File file : files) { if (keepDirStructure) { compress(file, zos, name + File.separator + file.getName(), keepDirStructure); } else { compress(file, zos, file.getName(), keepDirStructure); } } } } }
以上就是SpringBoot将多个文件夹进行压缩的两种方法(浏览器下载和另存为)的详细内容,更多关于SpringBoot文件夹压缩的资料请关注脚本之家其它相关文章!