package com.casic.missiles.utils; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @author zhouxuan * @since 2019/4/19 */ public class ZipUtils { public static void batchDownloadFiles(String rootFileName, HttpServletResponse response,String localFileDir) { FileInputStream is = null; BufferedOutputStream out = null; String rootFilePath = rootFileName + ".zip"; try { response.reset(); response.setCharacterEncoding("UTF-8"); response.setContentType("application/zip;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(rootFilePath, StandardCharsets.UTF_8.name())); response.setHeader("Access-Control-Allow-Origin", "*"); System.out.println(response.getHeader("Content-Disposition")); rootFilePath =zipFileCreator(localFileDir, rootFileName, rootFilePath); //开始下载 is = new FileInputStream(new File(rootFilePath)); out = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[1024]; int len = 0; while ((len = is.read(buff, 0, buff.length)) != -1) { out.write(buff, 0, len); } out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); if (StringUtils.isNotEmpty(rootFilePath)) { new ZipUtils().zipFileDeletor(rootFilePath); } } catch (IOException e) { e.printStackTrace(); } } } } /** * 批量打包 * * @param downloadPath 项目根目录 * @return tempDir 文件保存绝对路径 */ public static String zipFileCreator(String downloadPath, String tempDir,String papersZipName) { ZipOutputStream out = null; try { //zip文件保存路径 String zipPath = downloadPath + papersZipName; String fileSaveRootPath=downloadPath+tempDir; File file = new File(fileSaveRootPath); File[] files = file.listFiles(); out = new ZipOutputStream(new FileOutputStream(zipPath)); //遍历jsonArray列表获取所有JSONObject对象 for (int i = 0; i < files.length; i++) { //以论文标题为每个文件命名 FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); out.putNextEntry(new ZipEntry(files[i].getName())); //写入压缩包 int len; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) > 0) { out.write(buffer, 0, len); } out.closeEntry(); fis.close(); } out.close(); out.flush(); return zipPath; } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 批量打包 * * @param zipPath zip路径 * @return zip文件保存绝对路径 */ public void zipFileDeletor(String zipPath) { try { File zipFile=new File(zipPath); zipFile.delete(); } catch (Exception e) { e.printStackTrace(); } } }