将二进制数据放到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�
相关推荐
首先,我们可以使用`byte[]`数组作为数据类型来传递二进制文件。这种方式简单直接,客户端可以通过RPC(Remote Procedure Call)方式调用服务端的方法,将文件内容以字节数组的形式传递。然而,这种方式可能会遇到...
客户端首先会创建一个包含二进制数据的流对象,然后通过Web服务接口的特定方法将这个流作为参数传递。在后台,JAX-WS会自动处理MTOM优化,将二进制数据转换为XOP包装的附件,并生成相应的SOAP请求。 另一方面,"JAX...
本主题主要关注的是如何在C#和C# Web服务之间传递数组和二进制数据。这两种语言都广泛应用于开发Web服务,尤其是C#,它提供了强大的.NET Framework支持,使得构建Web服务变得更加便捷。 标题“C,C# webservice 返回...
在该文章中,我们使用 byte[] 类型参数来传递二进制文件。这种方法可以在客户端使用 RPC 方式进行调用。 使用 javax.activation.DataHandler 类型参数上传二进制文件 除了使用 byte[] 类型参数外,我们还可以使用 ...
2. **数据转换**:如果文件是以特定格式(如二进制或特定文本格式)传输的,JACOB可能用于将这些数据转换为COM组件可以理解的格式,以便进一步处理。 3. **文件上传**:在Web服务的客户端端,JACOB可以帮助将本地...
- 调用`uploadFile`服务操作,传递文件的二进制数据和相关元信息。这通常涉及到读取本地文件并将其内容转换为gSOAP支持的数据类型。 5. **WSDownFile**:在本示例中,`WSDownFile`可能是一个包含了客户端或服务器...
对于上传图片,Web Service应提供一个方法,接收图片文件的二进制数据。在C# WinForm客户端,你可以使用OpenFileDialog控件让用户选择要上传的图片文件,然后读取文件内容到Byte数组。例如: ```csharp using (var ...
2. 调用Web服务的上传或下载方法,可能需要传递文件的二进制数据或者其他参数。 3. 处理响应,将返回的数据保存到本地文件或显示给用户。 在压缩包的文件列表中,"dhf18_webservice.gif"可能是一个与Web服务相关的...
在文件传输中,SOAP消息包含了文件的元数据和二进制数据,通过SOAP封装后,可以通过HTTP请求进行发送。 3. **WSDL**:WSDL是一个XML文档,它描述了WebService提供的操作、输入和输出参数,以及它们与SOAP消息的关联...
在请求体中,需要包含文件的二进制数据和必要的请求头,如Content-Type(通常为multipart/form-data)。 4. **Multipart上传**: - 文件上传通常使用multipart/form-data格式,因为它允许同时发送多个部分(如文件...
- 定义一个WebMethod,接收二进制数组作为参数,这将对应Delphi发送的文件字节流。 - 使用System.IO命名空间中的类(如FileStream或MemoryStream)来保存接收到的字节流。 - 将字节流写入服务器指定的文件路径。 ...
通常需要处理文件的二进制数据、文件类型检查、大小限制等问题。在Ajax+WebService的场景下,文件通常先由前端转换为Base64编码或Blob对象,然后通过Ajax传递到Web服务进行处理。 4. **Ajax跨域问题**:由于浏览器...
在C#中,实现这个功能的一种方法是通过HTTP请求调用WebService接口,将HTML内容作为POST数据发送,并接收返回的PDF二进制流。以下是一个简单的示例代码: ```csharp using (var client = new WebClient()) { byte...
通过BinarySerialization优化序列化过程,使用DataSetSurrogate提高DataSet的序列化效率,借助SharpZipLib进行数据压缩,最后利用WS-Attachment传输二进制数据,这样可以构建出一个全面优化的Web Service数据传输...
开发者可以从"QDS"文件中查看具体的编程实现,理解如何将图片以二进制数据形式编码,如何构建SOAP消息来传递这些数据,以及如何在服务端解码并处理这些图片。同时,"www.pudn.com.txt"可能提供了更多上下文信息,如...
在WebService客户端中,如果需要传递二进制数据(如图片或证书),base64编码就显得非常有用,因为它可以确保这些数据在传输过程中不会被破坏。 至于“WebServiceClient”这个文件,很可能是一个包含整个客户端应用...
5. **二进制文件传输**:教程中涵盖如何通过WebService传输二进制数据,如图片和其他非文本文件,这对于数据交换特别是多媒体内容尤为重要。 6. **跨服务会话管理**:在分布式环境中,Axis2支持跨多个服务的会话...
2. **base64**:用于将二进制数据转换为文本字符串的编码方式,常见于传输二进制数据时的编码需求。 #### 三、详细步骤讲解 ##### 1. 安装必要的库 在开始之前,确保已经安装了`suds`库。可以通过pip命令来安装...
4. **文件上传**: 在C++中,文件通常以二进制流的形式读取并发送到Web服务。你需要打开文件,读取其内容,然后将其封装到SOAP消息中。Web服务端接收到文件后,会将其保存到指定位置。 5. **日志记录**: 日志功能...