利用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 |