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(); } } }