|
@@ -0,0 +1,115 @@
|
|
|
+package com.management.platform.util;
|
|
|
+
|
|
|
+import org.apache.commons.io.FileUtils;
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.*;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.zip.ZipEntry;
|
|
|
+import java.util.zip.ZipOutputStream;
|
|
|
+
|
|
|
+public class FileZipUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将指定路径下的所有文件打包zip导出
|
|
|
+ * @param response HttpServletResponse
|
|
|
+ * @param sourceFilePath 需要打包的文件夹路径
|
|
|
+ * @param fileName 下载时的文件名称
|
|
|
+ * @param postfix 下载时的文件后缀 .zip/.rar
|
|
|
+ */
|
|
|
+ public static void exportZip(HttpServletResponse response, String sourceFilePath, List<String> fileNames, String fileName, String postfix) {
|
|
|
+ // 默认文件名以时间戳作为前缀
|
|
|
+ if(StringUtils.isBlank(fileName)){
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
+ fileName = sdf.format(new Date());
|
|
|
+ }
|
|
|
+ String downloadName = fileName + postfix;
|
|
|
+ // 将文件进行打包下载
|
|
|
+ try {
|
|
|
+ OutputStream os = response.getOutputStream();
|
|
|
+ // 接收压缩包字节
|
|
|
+ byte[] data = createZip(sourceFilePath,fileNames);
|
|
|
+ response.reset();
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.addHeader("Access-Control-Allow-Origin", "*");
|
|
|
+ response.setHeader("Access-Control-Expose-Headers", "*");
|
|
|
+ // 下载文件名乱码问题
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadName, "UTF-8"));
|
|
|
+ //response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + downloadName);
|
|
|
+ response.addHeader("Content-Length", "" + data.length);
|
|
|
+ response.setContentType("application/octet-stream;charset=UTF-8");
|
|
|
+ IOUtils.write(data, os);
|
|
|
+ os.flush();
|
|
|
+ os.close();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建zip文件
|
|
|
+ * @param sourceFilePath
|
|
|
+ * @return byte[]
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private static byte[] createZip(String sourceFilePath,List<String> fileNames) throws Exception{
|
|
|
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
|
|
+ ZipOutputStream zip = new ZipOutputStream(outputStream);
|
|
|
+ // 将目标文件打包成zip导出
|
|
|
+ File file = new File(sourceFilePath);
|
|
|
+ handlerFile(zip, file,"",fileNames);
|
|
|
+ // 无异常关闭流,它将无条件的关闭一个可被关闭的对象而不抛出任何异常。
|
|
|
+ IOUtils.closeQuietly(zip);
|
|
|
+ return outputStream.toByteArray();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打包处理
|
|
|
+ * @param zip
|
|
|
+ * @param file
|
|
|
+ * @param dir
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private static void handlerFile(ZipOutputStream zip, File file, String dir,List<String> fileNames) throws Exception {
|
|
|
+ // 得到文件列表信息
|
|
|
+ File[] fileArray = file.listFiles();
|
|
|
+
|
|
|
+ if (fileArray == null) {
|
|
|
+ extracted(zip, file, dir);
|
|
|
+ } else {
|
|
|
+ // 过滤出与 fileNames 匹配的文件
|
|
|
+ for (File f : fileArray) {
|
|
|
+ if (fileNames.contains(f.getName())) { // 使用 contains 方法检查
|
|
|
+ extracted(zip, f, dir + f.getName()); // 打包处理匹配的文件
|
|
|
+ } else if (f.isDirectory()) {
|
|
|
+ // 递归处理子目录
|
|
|
+ handlerFile(zip, f, dir + f.getName() + "/", fileNames);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*//将文件夹添加到下一级打包目录
|
|
|
+ zip.putNextEntry(new ZipEntry(dir + "/"));
|
|
|
+ dir = dir.length() == 0 ? "" : dir + "/";
|
|
|
+ // 递归将文件夹中的文件打包
|
|
|
+ for (File f : fileArray) {
|
|
|
+ handlerFile(zip, f, dir + f.getName(),fileNames);
|
|
|
+ }*/
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void extracted(ZipOutputStream zip, File file, String dir) throws IOException {
|
|
|
+ // 如果当前的是文件,打包处理
|
|
|
+ BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
|
|
|
+ ZipEntry entry = new ZipEntry(dir); // 使用完整路径(包含文件名)
|
|
|
+ zip.putNextEntry(entry);
|
|
|
+ zip.write(FileUtils.readFileToByteArray(file));
|
|
|
+ IOUtils.closeQuietly(bis);
|
|
|
+ zip.closeEntry(); // 关闭当前条目
|
|
|
+ }
|
|
|
+}
|