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