二进制文件的处理(基于前面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, 0, 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);
}