使用jar包:apache内置的打包工具
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
public void filePackage(HttpServletRequest request, HttpServletResponse response) { List<Map<String, String>> querySelfCheckingList = queryCurrentPage(request, response);// 获取当前页巡检信息 String rootPath = request.getRealPath("/"); String sourcePath = rootPath + "temp_upload/"; File selfCheckingFolder = new File(sourcePath);// 创建文件夹,用于存放压缩包和其他文件夹 if (!selfCheckingFolder.exists()) { selfCheckingFolder.mkdirs(); } String zipName = "微信自助巡检.zip";// 定义压缩包名称 File zipFile = new File(zipName); File terminalIdPath = null; FileOutputStream fos = null; ZipOutputStream zos = null; OutputStream out = null; if (null != querySelfCheckingList && querySelfCheckingList.size() > 0) { for (Map<String, String> map : querySelfCheckingList) { String fssId = map.get("fssId"); String terminalId = map.get("terminalNo"); // 终端编号,命名当前记录的文件夹名称 logger.info(">>>>>>>SelfCheckingController>>>>>filePackage:fssId:{},terminalId:{}", fssId, terminalId); String path = terminalId + File.separator; terminalIdPath = new File(sourcePath + path);// 创建以终端号为名的文件夹,用于存放每条记录的图片 if (!terminalIdPath.exists()) { // 创建terminalIdPath文件夹 terminalIdPath.mkdirs(); } // 开始下载图片,并保存到本地 FileOutputStream outputStream = null; List<String> asList = split(fssId); for (int i = 0; i < asList.size(); i++) { try { byte[] bytes = fssClient.getFileContent(APP_CODE, asList.get(i), 30000);// 下载资质 CheckingFile checkingFile = new CheckingFile(); String fileName = String.valueOf(new Date().getTime()) + String.valueOf(i);// 定义文件名,默认以当前时间命名 checkingFile.setFssid(asList.get(i)); List<CheckingFile> checkingFileList = checkingFileService .queryCheckingFileByModel(checkingFile); if (null != checkingFileList && checkingFileList.size() > 0) { fileName = checkingFileList.get(0).getFileName(); } File sourceFile = new File(sourcePath + path + fileName + ".jpg"); outputStream = FileUtils.openOutputStream(sourceFile); outputStream.write(bytes); } catch (Exception e) { logger.error(">>>>>>>SelfCheckingController>>>>>filePackage:图片下载失败!{}", e); } finally { IoUtil.close(outputStream); } } } } try { File files = new File(sourcePath); fos = new FileOutputStream(zipName); zos = new ZipOutputStream(fos); writeZip(files, "", zos); } catch (FileNotFoundException e) { logger.error(">>>>>>>SelfCheckingController>>>>>filePackage:文件夹写入失败!{}", e); } try { out = response.getOutputStream(); response.reset(); response.setHeader("Content-Disposition", "attachment;filename=" + new String(zipName.getBytes("GB2312"), "ISO-8859-1")); response.setContentType("application/octet-stream; charset=utf-8"); response.setCharacterEncoding("UTF-8"); out.write(FileUtils.readFileToByteArray(zipFile)); out.flush(); out.close(); } catch (IOException e) { logger.error(">>>>>>>SelfCheckingController>>>>>filePackage:响应失败失败!{}", e); } } /** * @Title: split */ private List<String> split(String fssId) { String[] split = null; List<String> asList = new ArrayList<String>();// 分割fssId字符串数组,放入list if (StringUtils.isNotEmpty(fssId) && fssId.indexOf(",") != -1) { split = fssId.split(","); asList = Arrays.asList(split); } else { asList.add(fssId); } return asList; } /** * 写入压缩包 */ public void writeZip(File file, String parentPath, ZipOutputStream zos) { if (file.exists()) { // 需要压缩的文件夹是否存在 if (file.isDirectory()) {// 判断是否是文件夹 parentPath += file.getName() + File.separator; // 文件夹名称 + "/" File[] files = file.listFiles(); // 获取文件夹下的文件夹或文件 if (files.length != 0) { for (File f : files) { writeZip(f, parentPath, zos); } } else { // 空目录则创建当前目录 try { zos.putNextEntry(new ZipEntry(parentPath)); } catch (IOException e) { logger.error(">>>>>>>SelfCheckingController>>>>>writeZip:创建当前目录失败!{}", e); } } } else { FileInputStream fis = null; try { fis = new FileInputStream(file); ZipEntry ze = new ZipEntry(parentPath + file.getName()); zos.putNextEntry(ze); byte[] content = new byte[1024]; int len; while ((len = fis.read(content)) != -1) { zos.write(content, 0, len); zos.flush(); } } catch (Exception e) { logger.error(">>>>>>>SelfCheckingController>>>>>writeZip:文件未找到!{}", e); } finally { try { if (fis != null) { fis.close(); if (file != null && file.exists()) { file.delete(); } } } catch (IOException e) { logger.error(">>>>>>>SelfCheckingController>>>>>writeZip:输入流关闭失败!{}", e); } } } } }
效果如下:
解压后文件夹: