今天来介绍一下如何利用AXIS来传递文件。因为这已经是关于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"; ??
-
???? } ??
-
}??
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,flag);
}
input.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
return "failure";
}
return "Success";
}
}
?
transfer方法是service端接受客户端传来文件的方法,方法里面有两个参数,第一个是DataHandler。这个类可以看成是一个传送器,通过专门的序列化类将文件序列化。这个类的具体方法可以查一下SUN的API文档。第二个参数是一个String字符串,参数名就可以看出来,传递的是文件名。
?
这个方法从DataHandler得到一个输入流,从这个流里读出数据然后写到一个新文件里。这些都是一些基本的Java I/O操作。应该不会太难。服务器代码编写完之后下来是deploy.wsdd发布文件。
?
-
<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>??
<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然后发布服务。
?
服务器端的代码已经编写完成了,现在轮到客户端代码。因为是个简单的sample,所以做的事情也比较简单就是把C盘根目录上的一个文件通过webwervice储存到C盘,当然文件名要用另外一个。下面是客户端代码。
?
-
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);??
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(),JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);
call.addParameter("s1",ParameterMode.IN);
call.addParameter("s2",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....
Success
?
说明测试成功,到C盘上也可以找到aaaaa.txt这个文件。