zrj
2024-11-05 b8f2c19b869986efa519f1846b63b11378147861
src/main/java/org/springblade/common/utils/ZipUtil.java
@@ -1,8 +1,13 @@
package org.springblade.common.utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -81,7 +86,12 @@
        return list;
    }
    // 定义一个公共的静态方法zipFolder,用于压缩文件夹
   /**
    * 压缩文件夹
    * @param sourceFolderPath 压缩文件路径
    * @param zipFilePath 压缩后包的路径
    * @return
    */
    public static boolean zipFolder(String sourceFolderPath, String zipFilePath) {
        File sourceFile = new File(sourceFolderPath);
        try (
@@ -96,8 +106,48 @@
        return false;
    }
    // 将文件夹整体压缩
    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
   /**
    * 压缩文件夹
    * @param sourceFolderPath 压缩文件路径
    * @param zos zip输出流
    * @return
    */
    public static boolean zipFolder(String sourceFolderPath,ZipOutputStream zos) {
        File sourceFile = new File(sourceFolderPath);
      try {
         zipFile(sourceFile, sourceFile.getName(), zos);
      } catch (IOException e) {
         e.printStackTrace();
      }finally {
         // 删除生成的文件
         deleteDirectory(sourceFile);
      }
      return false;
    }
   /**
    * 删除文件夹下文件
    * @param directoryToBeDeleted
    * @return
    */
   public static boolean deleteDirectory(File directoryToBeDeleted) {
      File[] allContents = directoryToBeDeleted.listFiles();
      if (allContents != null) {
         for (File file : allContents) {
            deleteDirectory(file);
         }
      }
      return directoryToBeDeleted.delete();
   }
   /**
    * 将文件夹整体压缩
    * @param fileToZip
    * @param fileName 文件名称
    * @param zos
    * @throws IOException
    */
   public static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
@@ -126,7 +176,91 @@
        fis.close();
    }
    public static void main(String[] args) {
   /**
    * 设置导出zip的响应格式
    *
    * @param request
    * @param response
    * @param fileZip  zip的名字
    * @param filePath zip的路径
    * @throws UnsupportedEncodingException
    */
   public static void downLoadFile(HttpServletRequest request, HttpServletResponse response, String fileZip, String filePath) throws UnsupportedEncodingException {
      //进行浏览器下载
      final String userAgent = request.getHeader("USER-AGENT");
      //判断浏览器代理并分别设置响应给浏览器的编码格式
      String finalFileName = null;
      if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
         // IE浏览器
         finalFileName = URLEncoder.encode(fileZip, "UTF8");
         System.out.println("IE浏览器");
      } else if (StringUtils.contains(userAgent, "Mozilla")) {
         // google,火狐浏览器
         finalFileName = new String(fileZip.getBytes(), "ISO8859-1");
      } else {
         // 其他浏览器
         finalFileName = URLEncoder.encode(fileZip, "UTF8");
      }
      // 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
      response.setContentType("application/x-download");
      // 下载文件的名称
      response.setHeader("Content-Disposition", "attachment;filename=\"" + finalFileName + "\"");
      ServletOutputStream servletOutputStream = null;
      try {
         servletOutputStream = response.getOutputStream();
      } catch (IOException e) {
         e.printStackTrace();
      }
      DataOutputStream temps = new DataOutputStream(
         servletOutputStream);
      // 浏览器下载文件的路径
      DataInputStream in = null;
      try {
         in = new DataInputStream(
            new FileInputStream(filePath));
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      }
      byte[] b = new byte[2048];
      // 之后用来删除临时压缩文件
      File reportZip = new File(filePath);
      try {
         while ((in.read(b)) != -1) {
            temps.write(b);
         }
         temps.flush();
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         if (temps != null) {
            try {
               temps.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
         if (in != null) {
            try {
               in.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
         if (reportZip != null) {
            // 删除服务器本地产生的临时压缩文件!
            reportZip.delete();
         }
         try {
            servletOutputStream.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
   public static void main(String[] args) {
        // 调用方法进行测试
    }
}