webservice(九)在webservice中处理二进制(上传文件)
发布时间:2020-12-17 00:28:53 所属栏目:安全 来源:网络整理
导读:二进制文件的处理(基于前面webservice七的实现后,添加上传功能) 1.@MTOM ??? 1.1.修改wsdl加入如下代码: ?? ??? ??? ?xsd:complexType name="upload" ?? ??? ??? ??? ?xsd:sequence ?? ??? ??? ??? ??? ?xsd:element name="file" type="xsd:base64Binary
二进制文件的处理(基于前面webservice七的实现后,添加上传功能) 1.@MTOM ??? 1.1.修改wsdl加入如下代码: ?? ??? ??? ?<xsd:complexType name="upload"> ?? ??? ??? ??? ?<xsd:sequence> ?? ??? ??? ??? ??? ?<xsd:element name="file" type="xsd:base64Binary"></xsd:element> ?? ??? ??? ??? ?</xsd:sequence> ?? ??? ??? ?</xsd:complexType> ?? ??? ??? ?另加入与其他方法同样的代码 ?? 1. 2.在实现类中加入@MTOM ?? ??? ?生成服务器类文件 ?? ??? ?服务器参数为:byte[] file ?? ??? ?*只能在tomcat服务器中使用MTOM,在默认的Jetty服务器里面无法进行MTOM传递 ?? 1. 3.在使用port时 ?? ??? ??? ?port = us.getUserServicePort(new MTOMFeature()); 2.@BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING) ??? 2.1.修改wsdl加入如下代码: ?? ??? ??? ?如果记不住,可以发布服务然后访问xsd=1来查看 ?? ??? ??? ?<xsd:complexType name="upload"> ?? ??? ??? ??? ?<xsd:sequence> ?? ??? ??? ??? ??? ?<xsd:element xmlns:xmime="http://www.w3.org/2005/05/xmlmime" name="file" xmime:expectedContentTypes="application/octet-stream" type="xsd:base64Binary" form="qualified"/> ?? ??? ??? ??? ?</xsd:sequence> ?? ??? ??? ?</xsd:complexType> ?? ??? ??? ?另加入与其他方法同样的代码 ??? 2.2.在实现类中加入@MTOM ?? ??? ?生成服务器类文件 ?? ??? ?服务器参数为:@XmlMimeType("application/octet-stream")DataHandler handler ??? 2.3.在使用port时 ?? ??? ??? ?方式一:port = us.getUserServicePort(new MTOMFeature()); ?? ??? ??? ?方式二:port = us.getUserServicePort(); ?? ??? ??? ??? ??? ?BindingProvider bp = (BindingProvider)port; ?? ??? ??? ??? ??? ?SOAPBinding binding = (SOAPBinding) bp.getBinding(); 方式一:MTOM方式: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.zttc.edu.cn" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService" targetNamespace="http://service.zttc.edu.cn"> <!-- wrappered 推荐使用的方式 --> <wsdl:types> <xsd:schema targetNamespace="http://service.zttc.edu.cn"> <!-- import是在导入的时候加入了命名空间 --> <!-- <xsd:import namespace="http://service.zttc.edu.cn" schemaLocation="user.xsd"/> --> <!-- include是在当前的schema中加入了命名空间 --> <!-- <xsd:include schemaLocation="user.xsd"/> --> <xsd:element name="add" type="tns:add"></xsd:element> <xsd:element name="addResponse" type="tns:addResponse"></xsd:element> <xsd:element name="delete" type="tns:delete"></xsd:element> <xsd:element name="deleteResponse" type="tns:deleteResponse"></xsd:element> <xsd:element name="list" type="tns:list"></xsd:element> <xsd:element name="listResponse" type="tns:listResponse"></xsd:element> <xsd:element name="login" type="tns:login"></xsd:element> <xsd:element name="loginResponse" type="tns:loginResponse"></xsd:element> <!-- 1.添加二进制文件 --> <xsd:element name="upload" type="tns:upload"></xsd:element> <xsd:element name="uploadResponse" type="tns:uploadResponse"></xsd:element> <xsd:complexType name="uploadResponse"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="upload"> <xsd:sequence> <xsd:element name="file" type="xsd:base64Binary"></xsd:element> </xsd:sequence> </xsd:complexType> <!-- 1.添加异常 --> <xsd:element name="UserRunTimeException" type="tns:UserRunTimeException"></xsd:element> <xsd:complexType name="UserRunTimeException"> <xsd:sequence> <xsd:element name="message" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <!-- 1.header添加权限 --> <xsd:element name="licenceInfo" type="tns:licenceInfo"></xsd:element> <xsd:complexType name="licenceInfo"> <xsd:sequence> <xsd:element name="registUser" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="add"> <xsd:sequence> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="addResponse"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="delete"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="deleteResponse"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="list"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="listResponse"> <xsd:sequence minOccurs="1" maxOccurs="unbounded"> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="login"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> <xsd:element name="password" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="loginResponse"> <xsd:sequence> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="user"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> <xsd:element name="password" type="xsd:string" /> <xsd:element name="nickname" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="add"> <wsdl:part element="tns:add" name="parameters" /> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part element="tns:addResponse" name="parameters" /> </wsdl:message> <wsdl:message name="delete"> <wsdl:part element="tns:delete" name="parameters" /> </wsdl:message> <wsdl:message name="deleteResponse"> <wsdl:part element="tns:deleteResponse" name="parameters" /> </wsdl:message> <wsdl:message name="list"> <wsdl:part element="tns:list" name="parameters" /> </wsdl:message> <wsdl:message name="listResponse"> <wsdl:part element="tns:listResponse" name="parameters" /> </wsdl:message> <wsdl:message name="login"> <wsdl:part element="tns:login" name="parameters" /> </wsdl:message> <wsdl:message name="loginResponse"> <wsdl:part element="tns:loginResponse" name="parameters" /> </wsdl:message> <wsdl:message name="upload"> <wsdl:part element="tns:upload" name="parameters" /> </wsdl:message> <wsdl:message name="uploadResponse"> <wsdl:part element="tns:uploadResponse" name="parameters" /> </wsdl:message> <!-- 2.创建异常消息 --> <wsdl:message name="UserRunTimeException"> <wsdl:part element="tns:UserRunTimeException" name="fault" /> </wsdl:message> <!-- 2.创建header消息消息 --> <wsdl:message name="licenceInfo"> <wsdl:part element="tns:licenceInfo" name="licenceInfo" /> </wsdl:message> <wsdl:portType name="IUserService"> <wsdl:operation name="add"> <wsdl:input message="tns:add" /> <wsdl:output message="tns:addResponse" /> <!-- 3.为方法设置异常 --> <wsdl:fault name="UserRunTimeException" message="tns:UserRunTimeException" /> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input message="tns:delete" /> <wsdl:output message="tns:deleteResponse" /> <!-- 3.为方法设置异常 --> <wsdl:fault name="UserRunTimeException" message="tns:UserRunTimeException" /> </wsdl:operation> <wsdl:operation name="list"> <wsdl:input message="tns:list" /> <wsdl:output message="tns:listResponse" /> </wsdl:operation> <wsdl:operation name="login"> <wsdl:input message="tns:login" /> <wsdl:output message="tns:loginResponse" /> <!-- 3.为方法设置异常 --> <wsdl:fault name="UserRunTimeException" message="tns:UserRunTimeException" /> </wsdl:operation> <wsdl:operation name="upload"> <wsdl:input message="tns:upload" /> <wsdl:output message="tns:uploadResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="userServiceSOAP" type="tns:IUserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="add"> <wsdl:input> <soap:body use="literal" /> <!-- 3.设置头信息 --> <soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></soap:header> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> <!-- 4.进行异常的fault绑定 --> <wsdl:fault name="UserRunTimeException"> <soap:fault name="UserRunTimeException" use="literal" /> </wsdl:fault> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input> <soap:body use="literal" /> <!-- 3.设置头信息 --> <soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></soap:header> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> <!-- 4.进行异常的fault绑定 --> <wsdl:fault name="UserRunTimeException"> <soap:fault name="UserRunTimeException" use="literal" /> </wsdl:fault> </wsdl:operation> <wsdl:operation name="list"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="login"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> <!-- 4.进行异常的fault绑定 --> <wsdl:fault name="UserRunTimeException"> <soap:fault name="UserRunTimeException" use="literal" /> </wsdl:fault> </wsdl:operation> <wsdl:operation name="upload"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <!-- 在当前文件的最上面的name中填写的 --> <wsdl:service name="UserService"> <wsdl:port binding="tns:userServiceSOAP" name="userServicePort"> <soap:address location="http://localhost:8080/web-soa/us" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 重新生成接口后,修改实现类: package cn.edu.zttc.service; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; 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.WebServiceContext; import javax.xml.ws.soap.MTOM; import org.zttc.dao.UserDao; import org.zttc.dao.UserRunTimeException; import org.zttc.vo.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="cn.edu.zttc.service.IUserService",wsdlLocation="WEB-INF/wsdl/user.wsdl",serviceName="UserService",portName="userServicePort",targetNamespace="http://service.zttc.edu.cn") @MTOM public class UserServiceImpl implements IUserService { private UserDao userDao = UserDao.newInstence(); @Resource private WebServiceContext ctx; @Override public void add(User user) throws UserRunTimeException { checkRegister(); userDao.add(user); } @Override public void delete(String username) throws UserRunTimeException { checkRegister(); userDao.delete(username); } @Override public List<User> list() { return userDao.list(); } @Override public User login(String username,String password) throws UserRunTimeException { return userDao.login(username,password); } private void checkRegister() throws UserRunTimeException { try { HeaderList headers = (HeaderList)ctx.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); QName qname = new QName("http://service.zttc.edu.cn","licenceInfo"); if(headers==null) throw new UserRunTimeException("该功能需要进行权限控制"); Header header = headers.get(qname,true); if(header==null) throw new UserRunTimeException("该功能需要进行权限控制"); XMLStreamReader xsr = header.readHeader(); User u = x2user(xsr); User tu = userDao.loadByUsername(u.getUsername()); if(tu==null) throw new UserRunTimeException("你所使用的用户不是系统的授权用户"); if(!tu.getPassword().equals(u.getPassword())) throw new UserRunTimeException("授权用户的密码信息不正确!"); } catch (XMLStreamException e) { e.printStackTrace(); } } private User x2user(XMLStreamReader xsr) throws XMLStreamException { User u = new User(); while(xsr.hasNext()) { int event = xsr.next(); if(event==XMLEvent.START_ELEMENT) { String name = xsr.getName().toString(); if(name.equals("username")) { u.setUsername(xsr.getElementText()); } else if(name.equals("password")) { u.setPassword(xsr.getElementText()); } else if(name.equals("nickname")) { u.setNickname(xsr.getElementText()); } } } return u; } @Override public void upload(byte[] file) { FileOutputStream fos = null; System.out.println(file); try { fos = new FileOutputStream("D:/sid/workspace_webservice/wsimport/1.jpg"); fos.write(file); fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } 客户端调用: package org.zttc.test; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import javax.xml.namespace.QName; import javax.xml.ws.soap.MTOMFeature; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; import cn.edu.zttc.service.IUserService; import cn.edu.zttc.service.User; import cn.edu.zttc.service.UserRunTimeException_Exception; import cn.edu.zttc.service.UserService; public class TestService { private IUserService port; private UserService us; private String ns = "http://service.zttc.edu.cn"; @Before public void init(){ try { URL url = new URL("http://localhost:8989/web-soa/us?wsdl"); QName name = new QName(ns,"UserService"); us = new UserService(url,name); port = us.getUserServicePort(new MTOMFeature()); } catch (MalformedURLException e) { e.printStackTrace(); } } @Test public void testList(){ List<User> list = port.list(); for (User user : list) { System.out.println(user.getNickname()); } } @Test public void testAdd(){ try{ User user = new User(); user.setNickname("搜索"); user.setPassword("456123"); user.setUsername("ss"); port.add(user); }catch (UserRunTimeException_Exception e) { System.out.println(e.getMessage()); } } @Test public void testLogin(){ try{ User u = port.login("ss","456123"); System.out.println(u.getNickname()); }catch (UserRunTimeException_Exception e) { System.out.println(e.getMessage()); } } @Test public void testDelete(){ try { port.delete("ss"); } catch (UserRunTimeException_Exception e) { e.printStackTrace(); } } @Test public void testUpload() { try { byte[] file = FileUtils.readFileToByteArray(new File("E:/sid/original_HCIQ_5d5300000148125b.jpg")); port.upload(file); } catch (IOException e) { e.printStackTrace(); } } } 方式二:在方式一的基础上做入下修改: wsdl文件 <xsd:complexType name="upload"> <xsd:sequence> <xsd:element xmlns:xmime="http://www.w3.org/2005/05/xmlmime" name="file" xmime:expectedContentTypes="application/octet-stream" type="xsd:base64Binary" form="qualified"/> </xsd:sequence> </xsd:complexType> 生成服务器接口后,修改实现类 package cn.edu.zttc.service; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; 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.SOAPBinding; import org.apache.commons.io.FileUtils; import org.zttc.dao.UserDao; import org.zttc.dao.UserRunTimeException; import org.zttc.vo.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 = "cn.edu.zttc.service.IUserService",wsdlLocation = "WEB-INF/wsdl/user.wsdl",serviceName = "UserService",portName = "userServicePort",targetNamespace = "http://service.zttc.edu.cn") @BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING) public class UserServiceImpl implements IUserService { private UserDao userDao = UserDao.newInstence(); @Resource private WebServiceContext ctx; @Override public void add(User user) throws UserRunTimeException { checkRegister(); userDao.add(user); } @Override public void delete(String username) throws UserRunTimeException { checkRegister(); userDao.delete(username); } @Override public List<User> list() { return userDao.list(); } @Override public User login(String username,String password) throws UserRunTimeException { return userDao.login(username,password); } private void checkRegister() throws UserRunTimeException { try { HeaderList headers = (HeaderList) ctx.getMessageContext().get( JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); QName qname = new QName("http://service.zttc.edu.cn","licenceInfo"); if (headers == null) throw new UserRunTimeException("该功能需要进行权限控制"); Header header = headers.get(qname,true); if (header == null) throw new UserRunTimeException("该功能需要进行权限控制"); XMLStreamReader xsr = header.readHeader(); User u = x2user(xsr); User tu = userDao.loadByUsername(u.getUsername()); if (tu == null) throw new UserRunTimeException("你所使用的用户不是系统的授权用户"); if (!tu.getPassword().equals(u.getPassword())) throw new UserRunTimeException("授权用户的密码信息不正确!"); } catch (XMLStreamException e) { e.printStackTrace(); } } private User x2user(XMLStreamReader xsr) throws XMLStreamException { User u = new User(); while (xsr.hasNext()) { int event = xsr.next(); if (event == XMLEvent.START_ELEMENT) { String name = xsr.getName().toString(); if (name.equals("username")) { u.setUsername(xsr.getElementText()); } else if (name.equals("password")) { u.setPassword(xsr.getElementText()); } else if (name.equals("nickname")) { u.setNickname(xsr.getElementText()); } } } return u; } @Override public void upload(DataHandler file) { FileOutputStream fos = null; InputStream fis = null; try { // System.out.println(file.getContentType() + "--"+ file.getName()); // fis = file.getInputStream(); fis = file.getDataSource().getInputStream(); fos = new FileOutputStream("D:/sid/workspace_webservice/wsimport/1.jpg"); int len = 0; byte[] buf = new byte[1024]; while ((len=fis.read(buf))>0) { fos.write(buf,len); } fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } 客户端代码修改: @Test public void testUpload() { File file = new File("E:/sid/original_HCIQ_5d5300000148125b.jpg"); DataHandler handler = new DataHandler(new FileDataSource(file)); port.upload(handler); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- webservice学习笔记——入门篇
- Shell编程面试题5_实现判断10.0.0.0/24网络里,当前在线用户
- 【1509】【数据结构】Windows Message Queue
- WebService体系之——CXF由来
- 为什么Angular 2的性能优于Angular 1?
- 【Docker实战之入门】docker build -t csphere/php-fpm:5.4
- scala – 减少和折叠之间的差异
- angularjs – 重载当前状态 – 刷新数据
- unix – 检查是否存在具有完整路径名的文件时的二进制运算符
- Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]