利用AXIS来传递文件
package com.chnic.webservice; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.activation.DataHandler; public class FileTransfer { public FileTransfer(){ } public String transfer(DataHandler handler, String fileName){ String fullPath = "C:/" + fileName; File file = new File(fullPath); int flag = 0; if(handler == null) return "failure"; if(fileName == null) return "failure"; try { InputStream input = handler.getInputStream(); FileOutputStream fos = new FileOutputStream(file); byte[] buffer=new byte[4096]; while((flag=input.read(buffer))!=-1){ fos.write(buffer,0,flag); } input.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); return "failure"; } return "Success"; } }
transfer方法是service端接受客户端传来文件的方法,方法里面有两个参数,第一个是DataHandler。这个类能够当作是一个传送器,经过专门的序列化类将文件序列化。这个类的具体方法能够查一下SUN的API文档。第二个参数是一个String字符串,参数名就能够看出来,传递的是文件名。java
这个方法从DataHandler获得一个输入流,从这个流里读出数据而后写到一个新文件里。这些都是一些基本的Java I/O操做。应该不会太难。服务器代码编写完以后下来是deploy.wsdd发布文件。web
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="FileTransfer" provider="java:RPC"> <parameter name="className" value="com.chnic.webservice.FileTransfer"/> <parameter name="allowedMethods" value="transfer"/> <parameter name="scope" value="session"/> <operation name="transfer" qname="operNS:transfer" xmlns:operNS="file" returnQName="fileSend" returnType="rtns:string" xmlns:rtns="http://www.w3.org/2001/XMLSchema"> <parameter name="handler" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> <parameter name="fileName" type="myns:DataHandler" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <typeMapping qname="myns:DataHandler" xmlns:myns="http://fileTransfer.sample" languageSpecificType="java:javax.activation.DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </service> </deployment>
这个配置文件也很少介绍了,前几篇关于这几个元素的介绍已经比较清楚了,在这里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 这个类。前面序列化对象的时候提到序列化不一样对象的时候须要不一样的工厂类,一样在序列化文件的时候就要用这个工厂类。编写完一切,启动tomcat而后发布服务。apache
服务器端的代码已经编写完成了,如今轮到客户端代码。由于是个简单的sample,因此作的事情也比较简单就是把C盘根目录上的一个文件经过webwervice储存到C盘,固然文件名要用另一个。下面是客户端代码。tomcat
String fileName = "C:/sample.txt"; DataHandler dh=new DataHandler(new FileDataSource(fileName)); String endpoint="http://localhost:8080/axis/services/FileTransfer"; Service service=new Service(); Call call=(Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName(endpoint, "transfer")); QName qnameattachment=new QName("http://fileTransfer.sample", "myns:DataHandler"); call.registerTypeMapping(dh.getClass(), qnameattachment, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); call.addParameter("s1",qnameattachment,ParameterMode.IN); call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN); call.setReturnClass(String.class); String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"}); System.out.println("transfer success...."); System.out.println(ret);
客户端经过DataHandler取得源文件,以后注册DataHandler,注册两个输入参数和一个输出参数。以后传入相关的参数。新文件也在C盘下面名字为aaaaa.txt。运行测试代,控制台打出两句话。服务器 transfer success....
说明测试成功,到C盘上也能够找到aaaaa.txt这个文件。app |