`
uule
  • 浏览: 6359245 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

CompressionUtil - 生成文件并打包下载

 
阅读更多

1、调用

使用

CompressionUtil.zip2(Map<String, InputStream> in, OutputStream out) 方法

压缩为一个export-wsdl-20141023135549.zip的压缩包并自动下载

包括:

1、各服务名称文件夹 及子文件夹下3个文件 

2、校验码文件md5checksum.txt



 
md5checksum.txt文件内容:


  

注意:

1、Map<String, InputStream> in :

key为各文件名

value为各文件内容InputStream流

 

2、FilenameUtils.getName(path)

数据库中文件路径SERVER_ABS_PATH为:

/home/esbapp/lightesb/SYSFILE/1403612785951/SB_FI_ORS_InquiryPaymentApplicationInfoSrv/MsgHeader.xsd

 

获取的结果为MsgHeader.xsd

FilenameUtils.getName(path)
 a/b/c.txt --> c.txt
 a.txt     --> a.txt
 a/b/c     --> c
 a/b/c/    --> ""

  

数据库表格式

ESB_WSDL_FILE:


 

ESB_FILE(一个表,数据太长分开了):


 

 
视图ESB_WSDL_FILE_V省略

 

代码:

@RequestMapping(value = "esbService/exportWsdl.do", method = RequestMethod.GET)
@ResponseBody
public void exportWsdl(@RequestParam String info, HttpServletResponse response){
	//logger.debug("exportWsdl begin...");
	
	//logger.debug("parm : " + info);
	
	// 判断参数非空
	if(StringUtils.isNotEmpty(info)){
		/**
		* 构建Map<Long, String> basePath 
		* <srvId,srvName> 用于下面由srvId获取srvName,构建srvName文件夹
		* info = srvId1:srvName1,srvId2:srvName2,...
		* 无需关注
		*/
		// zip包基础路径
		Map<Long, String> basePath = new HashMap<Long, String>();
		
		// 要下载WSDL的服务id
		List<Long> srvId = new ArrayList<Long>();					
		String[] srvInfo = info.split(",");
		for(String si : srvInfo){
			String[] s = si.split(":");
			Long id = null;
			String srvName = null;
			try {
				id = Long.parseLong(s[0]);
				srvName = s[1];
			} catch (Exception e) {
				logger.error("exportWsdl parse parm error... " + si);
				continue;
			}
			srvId.add(id);
			basePath.put(id, srvName);
		}
		
		logger.debug("parse parm pass...");
		
		/**
		* =======================================
		* 压缩并自动下载
		* 重点关注部分
		* =======================================
		*/
		// 获取wsdl文件清单
		List<EsbWsdlFileV> ewf = esbServiceVDS.getWsdlFileList(srvId);
		
		//logger.debug("file list num : " + ewf.size());
		
		// detail为md5checksum.txt文件内容
		StringBuffer detail = new StringBuffer();
		detail.append("md5 checksum").append("\n");
		detail.append("\n");		
		
		Long timestamp = System.currentTimeMillis();
		Map<String, InputStream> in = new HashMap<String, InputStream>();
		for(EsbWsdlFileV f : ewf){
                        //文件真实路径
			String path = f.getServerAbsPath();
                        //生成的文件,如ESB_EOM_E12_ImportOrderUrgeInfoSrv/MsgHeader.xsd
			String zipPath = basePath.get(f.getServiceId()) + "/" + FilenameUtils.getName(path);
			try {
				in.put(zipPath, new FileInputStream(new File(path)));
				detail.append(f.getMd5CheckSum()).append("\t").append(zipPath).append("\n");
			} catch (FileNotFoundException e) {
				logger.error(path + " not found...");
			}
		}
		detail.append("\n");
		detail.append(String.format("generated by project %s", SysConfigCache.getConfigByName(Constants.VERSION))).append("\n");
		detail.append(String.format("%1$tF %1$tT", timestamp)).append("\n");
		detail.append("Copyright (c) 2004-2013 A-Company").append("\n");
		
		//logger.debug("zip files parm : " + in);
		
		try {
			in.put("md5checksum.txt", IOUtils.toInputStream(detail.toString(), "UTF-8"));
		} catch (IOException e1) {
			logger.error("can not generate file list...");
		}
		
		// httpheader设置
		response.setContentType("application/x-msdownload;");  
		response.setHeader("Content-disposition", "attachment; filename = export-wsdl-" + String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", timestamp) + ".zip");
		// 将wsdl文件压缩至请求流中
		try {
			CompressionUtil.zip2(in, response.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
			logger.error("exportWsdl zip error...");
		}
	}
	
	logger.debug("exportWsdl end...");
}

 

 

2、工具类:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class CompressionUtil {

	private static final int BUFFEREDSIZE = 1024;

	/**
	 * 将文件解压缩到指定目录
	 * 
	 * @param srcFile
	 * @param descDir
	 * @throws IOException
	 */
	public static void unzip(File srcFile, String descDir) throws IOException {
		// 创建解压目录
		new File(descDir).mkdirs();

		ZipFile zipFile = new ZipFile(srcFile);
		String strPath, gbkPath, strtemp;
		File tempFile = new File(descDir);
		strPath = tempFile.getAbsolutePath();
		@SuppressWarnings("rawtypes")
		java.util.Enumeration e = zipFile.getEntries();
		while (e.hasMoreElements()) {
			org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();
			gbkPath = zipEnt.getName();
			if (zipEnt.isDirectory()) {
				strtemp = strPath + File.separator + gbkPath;
				File dir = new File(strtemp);
				dir.mkdirs();
				continue;
			} else {
				// 读写文件
				InputStream is = zipFile.getInputStream(zipEnt);
				BufferedInputStream bis = new BufferedInputStream(is);
				gbkPath = zipEnt.getName();
				strtemp = strPath + File.separator + gbkPath;

				// 建目录
				String strsubdir = gbkPath;
				for (int i = 0; i < strsubdir.length(); i++) {
					if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {
						String temp = strPath + File.separator
								+ strsubdir.substring(0, i);
						File subdir = new File(temp);
						if (!subdir.exists())
							subdir.mkdir();
					}
				}
				FileOutputStream fos = new FileOutputStream(strtemp);
				BufferedOutputStream bos = new BufferedOutputStream(fos);
				int c;
				while ((c = bis.read()) != -1) {
					bos.write((byte) c);
				}
				bos.close();
				fos.close();
			}
		}
	}

	/**
	 * 解压指定路径的文件至指定目录
	 * 
	 * @param srcFilepath
	 * @param descDir
	 * @throws IOException
	 */
	public static void unzip(String srcFilepath, String descDir)
			throws IOException {
		File srcFile = new File(srcFilepath);
		unzip(srcFile, descDir);
	}

	/**
	 * 解压文件到当前目录
	 * 
	 * @param srcFile
	 * @throws IOException
	 */
	public static void unzip(File srcFile) throws IOException {
		unzip(srcFile, srcFile.getParent());
	}

	/**
	 * 解压指定路径的文件至当前目录
	 * 
	 * @param srcFilepath
	 * @throws IOException
	 */
	public static void unzip(String srcFilepath) throws IOException {
		File srcFile = new File(srcFilepath);
		unzip(srcFile, srcFile.getParent());
	}

	/**
	 * 压缩zip格式的压缩文件
	 * 
	 * @param inputFile
	 *            需压缩文件
	 * @param out
	 *            输出压缩文件
	 * @param base
	 *            ZipEntry name
	 * @throws IOException
	 */
	private static void zip(File inputFile, ZipOutputStream out, String base)
			throws IOException {
		if (inputFile.isDirectory()) {
			File[] inputFiles = inputFile.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < inputFiles.length; i++) {
				zip(inputFiles[i], out, base + inputFiles[i].getName());
			}
		} else {
			if (base.length() > 0) {
				out.putNextEntry(new ZipEntry(base));
			} else {
				out.putNextEntry(new ZipEntry(inputFile.getName()));
			}
			FileInputStream in = new FileInputStream(inputFile);
			try {
				int c;
				byte[] by = new byte[BUFFEREDSIZE];
				while ((c = in.read(by)) != -1) {
					out.write(by, 0, c);
				}
			} catch (IOException e) {
				throw e;
			} finally {
				in.close();
			}
		}
	}

	/**
	 * 压缩zip格式的压缩文件
	 * 
	 * @param inputFile
	 *            需压缩文件
	 * @param zipFilename
	 *            输出文件及详细路径
	 * @throws IOException
	 */
	public static void zip(File inputFile, String zipFilename)
			throws IOException {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
				zipFilename));
		try {
			zip(inputFile, out, "");
		} catch (IOException e) {
			throw e;
		} finally {
			out.close();
		}
	}

	/**
	 * 压缩zip格式的压缩文件
	 * 
	 * @param inputFilename
	 *            压缩的文件或文件夹及详细路径
	 * @param zipFilename
	 *            输出文件名称及详细路径
	 * @throws IOException
	 */
	public static void zip(String inputFilename, String zipFilename)
			throws IOException {
		zip(new File(inputFilename), zipFilename);
	}

	/**
	 * 压缩tar格式的压缩文件
	 * 
	 * @param inputFilename
	 *            压缩文件
	 * @param tarFilename
	 *            输出路径
	 * @throws IOException
	 */
	public static void tar(String inputFilename, String tarFilename)
			throws IOException {
		tar(new File(inputFilename), tarFilename);
	}

	/**
	 * 压缩tar格式的压缩文件
	 * 
	 * @param inputFile
	 *            压缩文件
	 * @param tarFilename
	 *            输出路径
	 * @throws IOException
	 */
	public static void tar(File inputFile, String tarFilename)
			throws IOException {
		TarOutputStream out = new TarOutputStream(new FileOutputStream(
				tarFilename));
		try {
			tar(inputFile, out, "");
		} catch (IOException e) {
			throw e;
		} finally {
			out.close();
		}
	}

	/**
	 * 压缩tar格式的压缩文件
	 * 
	 * @param inputFile
	 *            压缩文件
	 * @param out
	 *            输出文件
	 * @param base
	 *            结束标识
	 * @throws IOException
	 */
	private static void tar(File inputFile, TarOutputStream out, String base)
			throws IOException {
		if (inputFile.isDirectory()) {
			File[] inputFiles = inputFile.listFiles();
			out.putNextEntry(new TarEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < inputFiles.length; i++) {
				tar(inputFiles[i], out, base + inputFiles[i].getName());
			}
		} else {
			if (base.length() > 0) {
				out.putNextEntry(new TarEntry(base));
			} else {
				out.putNextEntry(new TarEntry(inputFile.getName()));
			}
			FileInputStream in = new FileInputStream(inputFile);
			try {
				int c;
				byte[] by = new byte[BUFFEREDSIZE];
				while ((c = in.read(by)) != -1) {
					out.write(by, 0, c);
				}
			} catch (IOException e) {
				throw e;
			} finally {
				in.close();
			}
		}
	}
	
	/**
	 * @param files <k, v>
	 *        k zip包中的路径
	 *        v 待压缩的文件
	 * @param out 输出流
	 */
	public static void zip(Map<String, File> files, OutputStream out) throws IOException {
		ZipOutputStream zos = new ZipOutputStream(out);
		for(String path : files.keySet()){
			zip(files.get(path), zos, path);
		}
		zos.close();
	}
	
	/**
	 * 流压缩
	 * 
	 * @param in 输入流
	 * @param out 输出流
	 * @param name 压缩包中路径
	 * @throws IOException
	 */
	private static void zip(InputStream in, ZipOutputStream out, String name)
			throws IOException {
		out.putNextEntry(new ZipEntry(name));
		try {
			int c;
			byte[] by = new byte[BUFFEREDSIZE];
			while ((c = in.read(by)) != -1) {
				out.write(by, 0, c);
			}
		} catch (IOException e) {
			throw e;
		} finally {
			in.close();
		}
	}
	
	/**
	 * 流压缩
	 * 
	 * @param in
	 * @param out
	 * @throws IOException
	 */
	public static void zip2(Map<String, InputStream> in, OutputStream out) throws IOException {
		ZipOutputStream zos = new ZipOutputStream(out);
		for(String path : in.keySet()){
			zip(in.get(path), zos, path);
		}
		zos.close();
	}
	
	/*
	public static void main(String[] args) throws IOException {
		ZipOutputStream zos = new ZipOutputStream(new File("D:/btest/jjx.zip"));
		zip(new File("D:/atest/build.xml"), zos, "srv1/build.xml");
		zip(new File("D:/atest/jaxws-custom.xml"), zos, "srv2/jaxws-custom.xml");
	}
	*/
}

 。。

 

 

 

 

 

 

 

 

  • 大小: 4.4 KB
  • 大小: 43.7 KB
  • 大小: 64 KB
  • 大小: 48 KB
  • 大小: 40.3 KB
  • 大小: 17.9 KB
  • 大小: 103.3 KB
分享到:
评论

相关推荐

    免费的防止锁屏小软件,可用于域统一管控下的锁屏机制

    免费的防止锁屏小软件,可用于域统一管控下的锁屏机制

    Python代码实现带装饰的圣诞树控制台输出

    内容概要:本文介绍了一段简单的Python代码,用于在控制台中输出一棵带有装饰的圣诞树。具体介绍了代码结构与逻辑,包括如何计算并输出树形的各层,如何加入装饰元素以及打印树干。还提供了示例装饰字典,允许用户自定义圣诞树装饰位置。 适用人群:所有对Python编程有一定了解的程序员,尤其是想要学习控制台图形输出的开发者。 使用场景及目标:适用于想要掌握如何使用Python代码创建控制台艺术,特别是对于想要增加节日氛围的小项目。目标是帮助开发者理解和实现基本的字符串操作与格式化技巧,同时享受创造乐趣。 其他说明:本示例不仅有助于初学者理解基本的字符串处理和循环机制,而且还能激发学习者的编程兴趣,通过调整装饰物的位置和树的大小,可以让输出更加个性化和丰富。

    白色大气风格的设计师作品模板下载.zip

    白色大气风格的设计师作品模板下载.zip

    电商平台开发需求文档.doc

    电商平台开发需求文档.doc

    白色简洁风格的办公室室内设计门户网站模板下载.zip

    白色简洁风格的办公室室内设计门户网站模板下载.zip

    VB+access干部档案管理系统(源代码+系统)(20246t).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    VB+ACCESS服装专卖店管理系统设计(源代码+系统+开题报告+答辩PPT)(2024ra).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    (179065812)基于Android stduio的手机银行开发与设计-用于课程设计

    课程设计---基于Android stduio的手机银行开发与设计 现今,手机已经成为人们生活和工作的必备品,在手机各种系统中Android系统是人们用的比较多的系统。手机银行也是人们在生活中比较常用的功能之一。本项目基于Android的手机银行开发与设计主要功能有登录注册、转账、转账记录查询、修改及查询个人信息、添加好友、向好友转账的功能。本项目主要用Android Studio 开发,数据库SQLite数据库,和夜神模拟器。 基于Android stduio的手机银行开发与设计项目主要功能有登录注册、转账、转账记录查询、修改及查询个人信息、添加好友、向好友转账的功能。。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    白色大气风格的婚礼现场倒计时模板下载.zip

    白色大气风格的婚礼现场倒计时模板下载.zip

    轮式移动机器人轨迹跟踪的MATHLAB程序,运用运动学和动力学模型的双闭环控制,借鉴自抗扰控制技术结合了非线性ESO,跟踪效果良好,控制和抗扰效果较优,可分享控制结构图 这段程序主要是一个小车的动力

    轮式移动机器人轨迹跟踪的MATHLAB程序,运用运动学和动力学模型的双闭环控制,借鉴自抗扰控制技术结合了非线性ESO,跟踪效果良好,控制和抗扰效果较优,可分享控制结构图。 这段程序主要是一个小车的动力学仿真程序,用于模拟小车在参考轨迹下的运动。下面我将对程序进行详细的分析解释。 首先,程序开始时使用`clear`、`clc`和`close all`命令来清除工作空间、命令窗口和图形窗口中的内容。 接下来,程序定义了一系列参数和变量,用于设置仿真的参数和存储仿真过程中的数据。这些参数包括小车的质量、车宽、驱动轮半径等,还有参考轨迹的振幅和频率,仿真步长,仿真时间等。 然后,程序定义了一些元胞数组,用于存储不同阶段的数据。这些数组包括参考轨迹位姿、真实运动轨迹位姿、参考轨迹一阶导数、参考轨迹速度、期望速度、真实速度、控制器输出的控制力矩、控制输入、期望速度与真实速度误差、摩擦值、外界扰动值、总扰动、位姿跟踪误差、扰动观测值等。 接下来,程序给这些变量赋初始值,包括小车的初始位姿和速度,初始速度,期望初始速度,控制器输出的控制力矩,扰动观测值等。 然后,程序进入一个循环,仿真时间从

    vb+ACCESS学生档案管理系统(论文+源代码)(2024ql).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    数据分析-31-疫情数据分析(包含代码和数据)

    这是一份来自开源的全球新冠肺炎数据集,每日时间序列汇总,包括确诊、死亡和治愈。所有数据来自每日病例报告。数据持续更新中。 由于数据集中没有美国的治愈数据,所以在统计全球的现有确诊人员和治愈率的时候会有很大误差,代码里面先不做这个处理,期待数据集的完善。

    白色大气风格的时装设计公司模板下载.zip

    白色大气风格的时装设计公司模板下载.zip

    白色大气风格的商务会议活动模板下载.rar

    白色大气风格的商务会议活动模板下载.rar

    vb+access工资管理系统(论文+程序+开题报告+外文翻译+答辩PPT)(2024k3).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    基于微信小程序的学生签到系统设计与实现ssm.zip

    本次开发一套基于微信小程序的生签到系统,有管理员,教师,学生三个角色。管理员功能有个人中心,学生管理,教师管理,签到管理,学生签到管理,班课信息管理,加入班课管理,请假信息管理,审批信息管理,销假信息管理,系统管理。教师和学生都可以在微信端注册和登录,教师可以管理签到信息,管理班课信息,审批请假信息,查看学生签到,查看加入班级,查看审批信息和销假信息。学生可以查看教师发布的学生签到信息,可以自己选择加入班课信息,添加请假信息,查看审批信息,进行销假操作。基于微信小程序的生签到系统服务端用Java开发的网站后台,接收并且处理微信小程序端传入的json数据,数据库用到了MySQL数据库作为数据的存储。

    技术资源分享-我的运维人生-《新年的奇妙团聚与希望之旅》

    **脚本描述**:本脚本围绕着新年这个充满欢乐与希望的时刻展开。故事发生在一个热闹的小镇,主要角色有在外打拼多年的年轻人小李,他的父母,以及一群充满活力的小镇居民。新年将至,小李踏上回家的旅途,满心期待与家人团聚。在小镇上,大家都在积极筹备新年,贴春联、挂灯笼、准备年夜饭。小李与家人重逢后,一起分享着彼此的故事和喜悦。同时,他们也和小镇居民一起举办了热闹的庆祝活动,在欢声笑语中迎接新年的到来。这个新年不仅让小李重新感受到了家的温暖,也让他对未来充满了信心和希望,他决定和小镇一起成长发展。通过这个脚本,展现新年带给人们的幸福、温暖和对未来的憧憬。

    Python 自动办公- Python分类汇总278张Excel表中的数据 Python源码

    Python 自动办公- Python分类汇总278张Excel表中的数据

    白色创意风格的用户信息登记源码下载.zip

    白色创意风格的用户信息登记源码下载.zip

Global site tag (gtag.js) - Google Analytics