`
leanore
  • 浏览: 5676 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

webservice传送实体文件

阅读更多
在最近的项目中,遇到需求,PDM系统通过webservice传输文件实体给其他系统,同时其他系统也需要通过webservice传送实体文件给PDM系统,此外,传输的文件还需要做压缩。
现在把实现方案整理一下,希望会对有这种需求的人有所帮助。
大概方案:
系统A:实体文件->byte[]->BASE64Encoder加密得到字符串,构造xml,作为返回内容(或在调用端作为参数)->压缩xml->BASE64Encoder加密。(实体文件到字符串)
系统B:取到结果->BASE64Decoder解密->解压->得到xml->解析到xml中内容->BASE64Decoder解密得到byte[]->写入文件(字符串到实体文件)。
XML如:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <document docNum="Document000001" version="A.1" >
    <file name="test1.doc">文件实体内容(加密字符串)</file>
    <file name="test2.xls">文件实体内容(加密字符串)</file>
  </document>
</root>
加密压缩,解密解压等方法整理在ZipByteUtil类中,下面附上。
解析xml代码如下(xml操作用的jdom包):
String xmlStr = call.invoke(..........);
xmlStr = ZipByteUtil.unzipAndDecode(str);//解密解压
SAXBuilder builder = new SAXBuilder();
Document newDoc = builder.build(new StringReader(xmlStr));
String path = "//file";
List list = XPath.selectNodes(newDoc, path);
System.out.println("文件总个数:"+list.size());
for (int i = 0; i < list.size(); i++) {
    Element elm1 = (Element) list.get(i);
    String fileName = elm1.getAttributeValue("name");
    String content = elm1.getText();
    FileOutputStream out = null;
    String newFile = "C:\\temp\\" + fileName;
    try {
        out = new FileOutputStream(newFile);
        try {
            //把文件内容解密得到byte[],写入文件
            byte[] bs = new BASE64Decoder().decodeBuffer(content);
    	   out.write(bs);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if(out != null){
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


字符串、文件进行解压解密,压缩加密的方法整理在如下类中
package ext.leanore.integration.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * 添加工具类,对字符串进行二进制压缩和解压操作
 * @author leanore
 *
 */
public class ZipByteUtil {
	/**
	 * 压缩字符串
	 * @author   leanore
	 * @param 需要压缩的字符串
	 * @return 压缩后的byte数组
	 ***************************************
	 */
	public static byte[] compress(String str) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ZipOutputStream zout = new ZipOutputStream(out);
		try {
			zout.putNextEntry(new ZipEntry("0"));
			zout.write(str.getBytes());
			zout.closeEntry();
			return out.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				zout.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return new byte[0];
	}
	/**
	 * 传入压缩后的byte数组,得到压缩之前的字符串
	 * @author   leanore
	 * @param compressed 字符串压缩得到的byte数组
	 * @return
	 ***************************************
	 */
	public static String decompress(byte[] compressed) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ByteArrayInputStream in = new ByteArrayInputStream(compressed);
		ZipInputStream zin = new ZipInputStream(in);
		String decompressed = "";
		try {
			zin.getNextEntry();
			byte[] buffer = new byte[1024];
			int offset = -1;
			while ((offset = zin.read(buffer)) != -1) {
				out.write(buffer, 0, offset);
			}
			decompressed = out.toString();
			return decompressed;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				zin.closeEntry();
				zin.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return "";
	}

	/**
	 * @TODO 对字符串进行压缩并做base64加密
	 * @auth leanore
	 * @return String
	 */
	public static String zipAndEncode(String source) {
		byte[] bytes = compress(source);
		return new BASE64Encoder().encode(bytes);
	}
	/**
	 * @TODO 对字符串进行解压并做base64解密
	 * @auth leanore
	 * @return String
	 */
	public static String unzipAndDecode(String source) throws IOException {
		return decompress(new BASE64Decoder().decodeBuffer(source));
	}

	/**
	 * @TODO 将传入的文件,转换为BASE64加密字符串
	 * @auth leanore
	 * @return String
	 */
	public static String encodeFileAsStr(File file) throws Exception {
		FileInputStream in = new FileInputStream(file);
		byte[] bytes = new byte[in.available()];
		in.read(bytes);
		String str = new BASE64Encoder().encode(bytes);
		return str;
	}
	
	/**
	 * @TODO 将一个文件流加密后的字符串,做解密操作,并写入指定路径
	 * @auth leanore
	 * @return File
	 */
	public static File decodeStrToFile(String content,String fullPath) {
		FileOutputStream out = null;
		File file = new File(fullPath);
		try {
			out = new FileOutputStream(file);
			try {
				byte[] bs = new BASE64Decoder().decodeBuffer(content);
				out.write(bs);
				out.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(out != null){
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return file;
	}
}
0
0
分享到:
评论
3 楼 chenyong0214 2013-02-07  
字符串加密后,可能出现xml不允许的字符,故而将加密字符串放于xml节点中,有时候会导致无法解析。
2 楼 bjqincy 2013-02-05  
最好使用下 实现JMS的框架。用于处理异步传输。参考http://xining.iteye.com/blog/512357 ,java 开源的有Apache ActiveMQ。
1 楼 bjqincy 2013-02-05  
没有MQ嗯

相关推荐

    java 利用webservice传输文件

    在“java 利用webservice传输文件”的场景中,JACOB可能被用来执行以下任务: 1. **文件操作**:Windows系统有许多内置的COM组件,如Scripting.FileSystemObject,可用于读写文件、创建目录等。通过JACOB,Java程序...

    webservice用于上传文件

    在本例中,"webservice用于上传文件"指的是利用WebService技术实现文件上传的功能。这个过程通常涉及客户端(通常是用户界面或者应用程序)发送文件数据到服务器端,服务器接收并处理这些数据,然后可能返回一些处理...

    webservice服务上传文件

    当我们谈论“WebService服务上传文件”时,我们关注的是如何利用WebService技术实现在客户端与服务器之间传输文件。在这种场景下,Java Axis库是实现WebService的一个常用工具。 Axis是Apache组织开发的一个开源...

    Webservice的wsdl文件

    通过wsdl文件就可以通过客户端调用服务端的接口,可以使用Webservice的服务了

    WebService 调用封装实体的接口 SOAP

    C#开发核心代码,用拼接XML方式,调用封装了实体类的SOAP接口

    WebService上传下载文件

    用webservice作为服务器端,以流的方式实现文件的上传和下载,可以自动调用winrar进行压缩和加密,支持多线程和断点续传功能,默认是16K一个包,全部源码,已经在实际项目中应用。客户端有winform和服务两种方式的...

    c++ gsoap webservice文件传送demo

    总结,本示例“c++ gsoap webservice文件传送demo”展示了如何在Windows 7下,使用Visual C++和gSOAP库实现Web服务的文件传输。通过理解gSOAP的工作原理和API,以及掌握客户端和服务端的实现细节,你可以创建自己的...

    通过webservice上传和下载文件

    在压缩包的文件列表中,"dhf18_webservice.gif"可能是一个与Web服务相关的示例图像,"2ccc.com.nfo"通常是信息文件,可能包含关于程序的详细信息。"WindowsApplication1"和"delphi示例"、"WebService1"、"delphiʾ...

    webservice下对json文件的操作

    在本示例中,我们将关注如何在WebService中处理JSON(JavaScript Object Notation)文件,这是一种轻量级的数据交换格式,常用于服务器与客户端之间的数据传输。 在Java环境中,使用WebService实现JSON文件的传输...

    webservice4 二进制文件读取

    在Web服务开发中,特别是基于Java的WebService,处理二进制文件(如图片、音频或视频文件)的传输是一个常见的需求。本文将详细讨论如何在WebService4中读取和传输二进制文件,以及涉及的相关技术。 首先,我们可以...

    C# 通过WebService上传视频文件到服务器虚拟机下源码

    本主题将深入探讨如何使用C#通过Web Service上传视频文件到服务器虚拟机下的源码实践。 首先,`WebService`是基于HTTP协议的远程调用技术,允许不同的应用程序之间进行数据交换。在C#中,我们通常使用ASP.NET来创建...

    delphi+C#webservice上传文件

    本话题主要聚焦于使用Delphi和C#两个不同的编程环境,通过Webservice来实现文件上传的功能。Delphi是一款强大的Windows应用程序开发工具,而C#是.NET框架下的主要编程语言,两者结合可以实现跨平台的通信。 1. **...

    WebService中上传文件

    在本场景中,我们关注的是使用WebService进行文件上传。WebService是基于标准的、平台无关的,通常使用SOAP(Simple Object Access Protocol)协议,通过HTTP进行通信。文件上传功能在许多Web应用中非常常见,例如...

    webservice 传输文件

    在“webservice传输文件”的场景中,我们主要探讨的是如何利用WebService技术来实现在网络环境中发送和接收文件。这个过程通常涉及XML(可扩展标记语言)、SOAP(简单对象访问协议)以及WSDL(Web服务描述语言)等...

    pb调用webservice的dll文件.zip

    PB对接Webservice所需要的的dll文件。我们用pb对接Webservice时,当我们打包部署的话,一定不要缺少这是多个dll文件,可以说缺一不可,亲测有效的,应用到生产中啦!开源不易,且行且珍惜

    引用的webservice 的示例文件

    引用的webservice 的示例文件.

    webservice接口wsdl生成本地客户端

    通过此方法可以把webservice接口通过接口生成的wsdl文件生成本地调用代码,详细配置可以查看wsdl2_java登入.bat文件,此包原来放在H盘根目录,双击wsdl2_java登入.bat文件即可以生成Create文件夹中的JAVA代码

    C# webservice大文件传输实例源码

    在IT行业中,大文件传输是一项常见的需求,尤其是在网络服务中,如C#的WebService应用。本实例源码提供了一个解决方案,允许用户通过C#编写的WebServcie进行大文件的上传和下载。以下是对这个实例的详细解读: 1. *...

    制作webservice的库文件和使用方法

    这个是使用java语言,来制作的webservice,有详细的使用方法和齐全的库文件,这个库文件用来替换tomcat7.0的库文件,因为里面加入了很多axis2的库文件,所以可以少走很多的弯路,直接替换就可以了

    Java WebService 简单实例 方式一(生成类文件方式)

    ### Java WebService 简单实例 方式一(生成类文件方式) #### 一、概述 在本篇文章中,我们将详细介绍如何通过生成类文件的方式来创建一个简单的 Java WebService 应用程序。这种方式非常适合初学者理解和实践 ...

Global site tag (gtag.js) - Google Analytics