趁著放假來更新一下博客,今天來介紹一下如何利用AXIS來傳遞文件。因為這已經(jīng)是關(guān)于AXIS的第五篇文章了,所以講的會比較快,有不明白的朋友可以翻翻前面的文章來參考一下。
直入主題,我們先來編寫服務(wù)器代碼
- 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端接受客戶端傳來文件的方法,方法里面有兩個參數(shù),第一個是DataHandler。這個類可以看成是一個傳送器,通過專門的序列化類將文件序列化。這個類的具體方法可以查一下SUN的API文檔。第二個參數(shù)是一個String字符串,參數(shù)名就可以看出來,傳遞的是文件名。
這個方法從DataHandler得到一個輸入流,從這個流里讀出數(shù)據(jù)然后寫到一個新文件里。這些都是一些基本的Java I/O操作。應(yīng)該不會太難。服務(wù)器代碼編寫完之后下來是deploy.wsdd發(fā)布文件。
- <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>
這個配置文件也不多介紹了,前幾篇關(guān)于這幾個元素的介紹已經(jīng)比較清楚了,在這里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 這個類。前面序列化對象的時候提到序列化不同對象的時候需要不同的工廠類,同樣在序列化文件的時候就要用這個工廠類。編寫完一切,啟動tomcat然后發(fā)布服務(wù)。
服務(wù)器端的代碼已經(jīng)編寫完成了,現(xiàn)在輪到客戶端代碼。因為是個簡單的sample,所以做的事情也比較簡單就是把C盤根目錄上的一個文件通過webwervice儲存到C盤,當(dāng)然文件名要用另外一個。下面是客戶端代碼。
- 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,注冊兩個輸入?yún)?shù)和一個輸出參數(shù)。之后傳入相關(guān)的參數(shù)。新文件也在C盤下面名字為aaaaa.txt。運行測試代,控制臺打出兩句話。
transfer success....
Success
說明測試成功,到C盤上也可以找到aaaaa.txt這個文件。
- 21:47
- 瀏覽 (1427)
- 評論 (4)
- 分類: Webservice
- 相關(guān)推薦
評論
剛剛查了下JDK 文件名完全可以用DataSource取出來。
我這篇文章里的這兒demo也是匆匆寫出來的 沒考慮那么多,請見諒。
至于傳遞多個文件名字。
最簡單的方法就是把文件名在客戶端按照規(guī)則做一定處理。比如:
filename1,filename2,filename3
一個String傳到服務(wù)器端 split一下就OK了。
FileOutputStream os;
try {
os = new FileOutputStream(filename);
handler.writeTo(os);
} catch (Exception e) {
e.printStackTrace();
}
我有個疑問,如果不通過這種方式傳filename,我們有沒有其他方式來傳filename,因為如果想同時傳多個文件的時候,這個就比較麻煩了。