`
uule
  • 浏览: 6349986 次
  • 性别: 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
分享到:
评论

相关推荐

    MiniGui业务开发基础培训-htk

    MiniGui业务开发基础培训-htk

    com.harmonyos.exception.DiskReadWriteException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    网络分析-Wireshark数据包筛选技巧详解及应用实例

    内容概要:本文档详细介绍了Wireshark软件中各种数据包筛选规则,主要包括协议、IP地址、端口号、包长以及MAC地址等多个维度的具体筛选方法。同时提供了大量实用案例供读者学习,涵盖HTTP协议相关命令和逻辑条件的综合使用方式。 适合人群:对网络安全或数据分析有一定兴趣的研究者,熟悉基本网络概念和技术的专业人士。 使用场景及目标:适用于需要快速准确捕获特定类型网络流量的情况;如网络安全检测、性能优化分析、教学演示等多种实际应用场景。 阅读建议:本资料侧重于实操技能提升,在学习时最好配合实际操作练习效果更佳。注意掌握不同类型条件组合的高级用法,增强问题解决能力。

    com.harmonyos.exception.BatteryOverheatException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    com.harmonyos.exception.ServiceUnavailableException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    MATLAB上机试题 MATLAB原理及应用实验报告 第3章 MATLAB的符号运算.docx

    内容概要:本文档详细介绍了MATLAB的符号运算,涵盖符号对象的命名方法、基本运算、级数求法等多个方面。通过具体的实验案例,如确定符号表达式中的变量、执行四则运算、提取分子分母、因式分解与展开、化简符号表达式、级数符号求和、符号微积分以及符号方程的求解,帮助学生理解和掌握MATLAB中的符号运算技巧。 适合人群:适用于对MATLAB有一定了解的大专院校的学生、研究人员和技术工作者。 使用场景及目标:通过本课程的学习,学员能够熟练使用MATLAB完成复杂的数学问题解决,提高科研项目和工程任务中对数学模型的建模能力和问题解决效率。 其他说明:文档包含详细的实验步骤指导和实例演示,同时提供了丰富的练习题供读者巩固所学知识。对于想要深入研究MATLAB符号运算的人来说是一份宝贵资料。

    springboot vue2 mysql 校园美食分享平台 论文.docx

    适合参考论文写作

    联通精准营销平台外呼系统HTTP接口规范

    内容概要:文档介绍了联通精准营销平台外呼系统的HTTP接口规范(V2.3),提供了API接口用于外呼业务的各种功能,确保企业的市场拓展和技术操作的无缝衔接。主要涵盖接口列表如坐席登录、数据获取、企业修改密码等,并详细说明了每个接口的方法、路径、请求参数及返回状态。针对外呼过程中的常见问题给出了处理指导,旨在帮助企业高效开展外呼业务,同时保障数据的安全性和合规性。 适用人群:适用于企业IT技术人员、营销人员以及任何希望利用电信运营商提供的API来增强自身外呼和数据分析能力的专业人士。 使用场景及目标:企业可通过这些API实现与联通平台的数据交互,包括但不限于获取客户资料、发起呼叫、管理和统计外呼数据,从而提升营销效率和客户服务体验。特别强调在外呼过程中涉及的身份认证、信息安全等方面的处理措施。 其他说明:此接口文档更新频繁,版本为2.3。企业需要及时关注最新动态以便充分利用各项功能优化营销策略。同时应注意遵守中国联通关于数据安全的相关政策法规。

    springboot vue2 mysql 图书馆管理系统 论文.docx

    适合参考论文写作

    java项目,课程设计-springboot校园在线拍卖系统

    java项目,课程设计-springboot校园在线拍卖系统,随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化办公。 本课题在充分研究了在Springboot框架基础上,采用B/S模式,以Java为开发语言,MyEclipse为开发工具,MySQL为数据管理平台,实现的内容主要包括首页,个人中心,综合管理等功能。

    全媒体运营+江苏工匠比赛

    全媒体运营+江苏工匠比赛

    com.pureharmony.exception.CredentialValidationException.md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    com.harmonyos.exception.CloudServiceConnectionException(解决方案).md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    com.harmonyos4.exception.VirtualMemoryAllocationException

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    IEC 60598-1-2020中文翻译.pdf

    IEC 60598-1-2020中文翻译

    com.pureharmony.exception.ResourceLockException.md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    诗经数据,包含注释,翻译以及解读

    {"_id":{"$oid":"67302bf63eeb6773961e96bb"},"title":"关雎","belong":"国风·周南","appreciation":[{"title":"【注释】","content":"关关雎鸠〔jūjiū〕:关关,雄雌水鸟相互应和的鸣叫声。雎鸠,亦称王鴡,一种水鸟名,上体暗褐,下体白色,善捕鱼。洲:水中的陆地。窈窕〔yǎo tiǎo〕:娴静貌,美好貌。窈,喻女子心灵美;窕,喻女子仪表美。仇〔qiú〕:古同“逑”,配偶。荇〔xìng〕菜:又名莕菜,多年生水生草本,圆叶细茎,叶可食用。流:义同“求”,此指顺水势摘采。寤寐〔wù mèi〕:日夜。寤,醒时。寐,睡时。思服:思,语气助词,无实义。服,思念。友:亲近,结交。芼〔mào〕:以手指或指尖采摘。"},{"title":"【翻译】","content":"\n\r\n\t相对啼鸣的雌雄雎鸠,就在河水中央的小洲之上。娴静淑雅的女子,是君子最好的配偶。长短不齐的荇菜,从长短不齐的荇菜,从左边或右边逐一采摘。娴静淑雅的女子,演奏琴瑟来与她相交。长短不齐的荇菜,从左边或右边轻轻拈取。娴静淑雅的女子,

    com.pureharmony.exception.FirmwareUpdateFailureException

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

    com.harmonyos4.exception.ResourceThrottlingException.md

    鸿蒙开发中碰到的报错,问题已解决,写个文档记录一下这个问题及解决方案

Global site tag (gtag.js) - Google Analytics