`
schy_hqh
  • 浏览: 555882 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

webservice传递二进制数据(文件)

 
阅读更多

将二进制数据放到Attachment中进行传递,而不是放到SOAPBODY进行传递

 

 xsd文件中定义二进制数据类型

<xsd:element type="tns:upload" name="upload"/> 
<xsd:element type="tns:uploadResponse" name="uploadResponse"/> 
<xsd:complexType name="upload"> 
 <xsd:sequence> 
  <xsd:element type="xsd:base64Binary" name="file" minOccurs="0"/> 
 </xsd:sequence> 
</xsd:complexType> 
<xsd:complexType name="uploadResponse"> 
 <xsd:sequence/> 
</xsd:complexType>

 

第一种方式:

服务端 @MOTM 

客户端 new MTOMFeature(true)

接口参数:byte[] file

 

1.使用附件的形式传递二进制数据

接口

package com.hqh.service;

import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

import com.hqh.model.User;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "IUserService", targetNamespace = "http://service.hqh.com")

public interface IUserService {

    /**
     * 文件上传服务
     * @param file
     */
    @WebMethod
    @RequestWrapper(localName = "upload", targetNamespace = "http://service.hqh.com", className = "com.hqh.service.Upload")
    @ResponseWrapper(localName = "uploadResponse", targetNamespace = "http://service.hqh.com", className = "com.hqh.service.UploadResponse")
    public void upload(
        @WebParam(name = "file", targetNamespace = "http://service.hqh.com")
        byte[] file);
}

 

 

服务器端实现类上增加MTOM注解

 

@WebService(endpointInterface="com.hqh.service.IUserService",
			wsdlLocation="WEB-INF/wsdl/user.wsdl",
			serviceName="UserService",
			portName="userServicePort",
			targetNamespace="http://service.hqh.com")
@MTOM
public class UserServiceImpl implements IUserService {
	

	@Override
	public void upload(byte[] data) {
		FileOutputStream os = null;
		try {
			os = new FileOutputStream("E:/technology-hqh/proj/webservice/a.tmp");
			os.write(data);
			os.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(os!=null) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}

}

 

客户端

 

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.soap.MTOMFeature;

import org.apache.commons.io.FileUtils;
import org.junit.Before;

import com.hqh.service.IUserService;
import com.hqh.service.UserService;



public class Test {
	private UserService service ;
	private IUserService iservice ;
	@Before
	public void init() {
		try {
			URL url = new URL("http://localhost:8888/Demo/service");
			QName name = new QName("http://service.hqh.com", "UserService");
			service = new UserService(url,name);
			//开启MTOM功能,二进制文件将以附件形式传递
			iservice = service.getUserServicePort(new MTOMFeature(true));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	
	@org.junit.Test
	public void testUpload() {
		try {
			String path1="E:/technology-hqh/proj/webservice/35_二进制的处理(使用MTOM).avi";
			String path2="D:/scott.dmp";
			byte[] data = FileUtils.readFileToByteArray(
					new File(path2));
			iservice.upload(data);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

 

 

使用Eclipse的TCPM监控可观察到数据传输过程:

Host: localhost:8888
Connection: keep-alive
Content-Length: 21291

--uuid:7a022a6f-e4f9-49de-9683-805e4f9ce0e7
Content-Id: <rootpart*7a022a6f-e4f9-49de-9683-805e4f9ce0e7@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
 <S:Body>
  <ns2:upload xmlns:ns2="http://service.hqh.com">
   <file>
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
     href="cid:19d34ad8-d956-4b9d-95bc-9f9f5ccc3760@example.jaxws.sun.com"></xop:Include>
   </file>
  </ns2:upload>
 </S:Body>
</S:Envelope>
--uuid:7a022a6f-e4f9-49de-9683-805e4f9ce0e7Content-Id: <19d34ad8-d956-4b9d-95bc-9f9f5ccc3760@example.jaxws.sun.com>
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

TEXPORT:V10.02.01
USCOTT
RUSERS
2048
0
20
0
TT�
...

 

 

 第二种方式:

服务端 @BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING)

客户端 DataHandler

接口参数:DataHandler handler

 

1.xsd

 

<!-- 文件上传 -->
<xsd:element type="tns:upload" name="upload"/> 
<xsd:element type="tns:uploadResponse" name="uploadResponse"/> 
<xsd:complexType name="upload"> 
	<xsd:sequence> 
		<!-- <xsd:element type="xsd:base64Binary" name="file" minOccurs="0"/> -->
		<!-- 第二种方式 -->
		<xsd:element xmlns:xmime="http://www.w3.org/2005/05/xmlmime"  
					 xmime:expectedContentTypes="application/octet-stream"
			type="xsd:base64Binary" name="file" minOccurs="0" form="qualified" /> 
	</xsd:sequence> 
</xsd:complexType> 
<xsd:complexType name="uploadResponse"> 
	<xsd:sequence/> 
</xsd:complexType>

 

 

接口

package com.hqh.service;

import java.util.List;

import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

import com.hqh.model.User;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "IUserService", targetNamespace = "http://service.hqh.com")

public interface IUserService {


    /**
     * 文件上传服务
     * @param file
     */
    @WebMethod
    @RequestWrapper(localName = "upload", targetNamespace = "http://service.hqh.com", className = "com.hqh.service.Upload")
    @ResponseWrapper(localName = "uploadResponse", targetNamespace = "http://service.hqh.com", className = "com.hqh.service.UploadResponse")
    public void upload(
        @WebParam(name = "file", targetNamespace = "http://service.hqh.com")
        @XmlMimeType("application/octet-stream")DataHandler handler);
}

 实现类

 

package com.hqh.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.activation.DataHandler;
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.ws.BindingType;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.soap.MTOM;
import javax.xml.ws.soap.SOAPBinding;

import org.apache.commons.io.FileUtils;

import com.hqh.model.User;
import com.sun.xml.ws.api.message.Header;
import com.sun.xml.ws.api.message.HeaderList;
import com.sun.xml.ws.developer.JAXWSProperties;


@WebService(endpointInterface="com.hqh.service.IUserService",
			wsdlLocation="WEB-INF/wsdl/user.wsdl",
			serviceName="UserService",
			portName="userServicePort",
			targetNamespace="http://service.hqh.com")
//@MTOM
@BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
public class UserServiceImpl implements IUserService {

	@Override
	public void upload(DataHandler handler) {
		FileOutputStream os = null;
		InputStream is = null;
		try {
			System.out.println(handler.getContentType());
			is = handler.getInputStream();
			
			int len = 0;
			byte[] buf = new byte[1024];
			os = new FileOutputStream("E:/technology-hqh/proj/webservice/b.tmp");
			while((len=is.read(buf))!=-1) {
				os.write(buf, 0, len);
			}
			os.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(os!=null)
					os.close();
				if(is!=null)
					is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

客户端

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.soap.MTOMFeature;
import javax.xml.ws.soap.SOAPBinding;

import org.apache.commons.io.FileUtils;
import org.junit.Before;

import com.hqh.service.IUserService;
import com.hqh.service.UserService;



public class Test {
	private UserService service ;
	private IUserService iservice ;
	@Before
	public void init() {
		try {
			URL url = new URL("http://localhost:8888/Demo/service");
			QName name = new QName("http://service.hqh.com", "UserService");
			service = new UserService(url,name);
			
			//开启MTOM功能,二进制文件将以附件形式传递
			
			//第一种方式
//			iservice = service.getUserServicePort(new MTOMFeature(true));
			
			//第二种方式
			iservice = service.getUserServicePort();
			BindingProvider provider = (BindingProvider) iservice;
			SOAPBinding binding =  (SOAPBinding) provider.getBinding();
			binding.setMTOMEnabled(true);
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	
	@org.junit.Test
	public void testUpload() {
		String path1="E:/technology-hqh/proj/webservice/35_二进制的处理(使用MTOM).avi";
		String path2="D:/scott.dmp";
		DataHandler handler = new DataHandler(new FileDataSource(new File(path2)));
		iservice.upload(handler);
	}
}

 

 

通过eclipse的TCPM观察文件的传输:

GET /Demo/service?wsdl HTTP/1.1
User-Agent: Java/1.6.0_18
Host: localhost:8888
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

POST /Demo/service HTTP/1.1
Content-type: multipart/related;start="<rootpart*dded5b46-a30b-4376-8f73-d0ab8d716898@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:dded5b46-a30b-4376-8f73-d0ab8d716898";start-info="text/xml"
Soapaction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.6 in JDK 6
Host: localhost:8888
Connection: keep-alive
Content-Length: 21299

--uuid:dded5b46-a30b-4376-8f73-d0ab8d716898
Content-Id: <rootpart*dded5b46-a30b-4376-8f73-d0ab8d716898@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
	<S:Body>
		<ns2:upload xmlns:ns2="http://service.hqh.com">
			<ns2:file>
				<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
					href="cid:50f22c0a-386d-4db6-9c80-0c01fb2ceb6d@example.jaxws.sun.com"></xop:Include>
			</ns2:file>
		</ns2:upload>
	</S:Body>
</S:Envelope>
--uuid:dded5b46-a30b-4376-8f73-d0ab8d716898
Content-Id: <50f22c0a-386d-4db6-9c80-0c01fb2ceb6d@example.jaxws.sun.com>
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

TEXPORT:V10.02.01
USCOTT
RUSERS
2048
0
20
0
TT�

 

分享到:
评论

相关推荐

    webservice4 二进制文件读取

    首先,我们可以使用`byte[]`数组作为数据类型来传递二进制文件。这种方式简单直接,客户端可以通过RPC(Remote Procedure Call)方式调用服务端的方法,将文件内容以字节数组的形式传递。然而,这种方式可能会遇到...

    WebService二进制处理

    客户端首先会创建一个包含二进制数据的流对象,然后通过Web服务接口的特定方法将这个流作为参数传递。在后台,JAX-WS会自动处理MTOM优化,将二进制数据转换为XOP包装的附件,并生成相应的SOAP请求。 另一方面,"JAX...

    C,C#webservice 返回数组,二进制

    本主题主要关注的是如何在C#和C# Web服务之间传递数组和二进制数据。这两种语言都广泛应用于开发Web服务,尤其是C#,它提供了强大的.NET Framework支持,使得构建Web服务变得更加便捷。 标题“C,C# webservice 返回...

    WebService大讲堂之Axis2(4):二进制文件传输.pdf

    在该文章中,我们使用 byte[] 类型参数来传递二进制文件。这种方法可以在客户端使用 RPC 方式进行调用。 使用 javax.activation.DataHandler 类型参数上传二进制文件 除了使用 byte[] 类型参数外,我们还可以使用 ...

    java 利用webservice传输文件

    2. **数据转换**:如果文件是以特定格式(如二进制或特定文本格式)传输的,JACOB可能用于将这些数据转换为COM组件可以理解的格式,以便进一步处理。 3. **文件上传**:在Web服务的客户端端,JACOB可以帮助将本地...

    c++ gsoap webservice文件传送demo

    - 调用`uploadFile`服务操作,传递文件的二进制数据和相关元信息。这通常涉及到读取本地文件并将其内容转换为gSOAP支持的数据类型。 5. **WSDownFile**:在本示例中,`WSDownFile`可能是一个包含了客户端或服务器...

    C# winfrom中webservice接口连接服务器上传图片和下载图片

    对于上传图片,Web Service应提供一个方法,接收图片文件的二进制数据。在C# WinForm客户端,你可以使用OpenFileDialog控件让用户选择要上传的图片文件,然后读取文件内容到Byte数组。例如: ```csharp using (var ...

    通过webservice上传和下载文件

    2. 调用Web服务的上传或下载方法,可能需要传递文件的二进制数据或者其他参数。 3. 处理响应,将返回的数据保存到本地文件或显示给用户。 在压缩包的文件列表中,"dhf18_webservice.gif"可能是一个与Web服务相关的...

    webservice 传输文件

    在文件传输中,SOAP消息包含了文件的元数据和二进制数据,通过SOAP封装后,可以通过HTTP请求进行发送。 3. **WSDL**:WSDL是一个XML文档,它描述了WebService提供的操作、输入和输出参数,以及它们与SOAP消息的关联...

    Android 上传文件到c# webservice

    在请求体中,需要包含文件的二进制数据和必要的请求头,如Content-Type(通常为multipart/form-data)。 4. **Multipart上传**: - 文件上传通常使用multipart/form-data格式,因为它允许同时发送多个部分(如文件...

    delphi+C#webservice上传文件

    - 定义一个WebMethod,接收二进制数组作为参数,这将对应Delphi发送的文件字节流。 - 使用System.IO命名空间中的类(如FileStream或MemoryStream)来保存接收到的字节流。 - 将字节流写入服务器指定的文件路径。 ...

    ajax+webservice跨域实现文件上传

    通常需要处理文件的二进制数据、文件类型检查、大小限制等问题。在Ajax+WebService的场景下,文件通常先由前端转换为Base64编码或Blob对象,然后通过Ajax传递到Web服务进行处理。 4. **Ajax跨域问题**:由于浏览器...

    WebService接口+HTML转PDF文件(多种转换生成下载方式)

    在C#中,实现这个功能的一种方法是通过HTTP请求调用WebService接口,将HTML内容作为POST数据发送,并接收返回的PDF二进制流。以下是一个简单的示例代码: ```csharp using (var client = new WebClient()) { byte...

    实战 Web Service 压缩传输

    通过BinarySerialization优化序列化过程,使用DataSetSurrogate提高DataSet的序列化效率,借助SharpZipLib进行数据压缩,最后利用WS-Attachment传输二进制数据,这样可以构建出一个全面优化的Web Service数据传输...

    QDS.rar_WebService 图片_webservice

    开发者可以从"QDS"文件中查看具体的编程实现,理解如何将图片以二进制数据形式编码,如何构建SOAP消息来传递这些数据,以及如何在服务端解码并处理这些图片。同时,"www.pudn.com.txt"可能提供了更多上下文信息,如...

    python WebService Client

    在WebService客户端中,如果需要传递二进制数据(如图片或证书),base64编码就显得非常有用,因为它可以确保这些数据在传输过程中不会被破坏。 至于“WebServiceClient”这个文件,很可能是一个包含整个客户端应用...

    Axis2(WebService)经典教程.docx

    5. **二进制文件传输**:教程中涵盖如何通过WebService传输二进制数据,如图片和其他非文本文件,这对于数据交换特别是多媒体内容尤为重要。 6. **跨服务会话管理**:在分布式环境中,Axis2支持跨多个服务的会话...

    python调用WEBSERVICE接口

    2. **base64**:用于将二进制数据转换为文本字符串的编码方式,常见于传输二进制数据时的编码需求。 #### 三、详细步骤讲解 ##### 1. 安装必要的库 在开始之前,确保已经安装了`suds`库。可以通过pip命令来安装...

    C++、SOAP实现调用webservice接口,上传文件、日志

    4. **文件上传**: 在C++中,文件通常以二进制流的形式读取并发送到Web服务。你需要打开文件,读取其内容,然后将其封装到SOAP消息中。Web服务端接收到文件后,会将其保存到指定位置。 5. **日志记录**: 日志功能...

Global site tag (gtag.js) - Google Analytics