posts - 64,  comments - 9,  trackbacks - 0

          趁著放假來更新一下博客,今天來介紹一下如何利用AXIS來傳遞文件。因?yàn)檫@已經(jīng)是關(guān)于AXIS的第五篇文章了,所以講的會(huì)比較快,有不明白的朋友可以翻翻前面的文章來參考一下。

           

          直入主題,我們先來編寫服務(wù)器代碼

          Java代碼 復(fù)制代碼
          1. package com.chnic.webservice;   
          2.   
          3. import java.io.File;   
          4. import java.io.FileOutputStream;   
          5. import java.io.IOException;   
          6. import java.io.InputStream;   
          7.   
          8. import javax.activation.DataHandler;   
          9.   
          10. public class FileTransfer {   
          11.   
          12.     public FileTransfer(){   
          13.            
          14.     }   
          15.        
          16.     public String transfer(DataHandler handler, String fileName){   
          17.         String fullPath = "C:/" + fileName;   
          18.         File file = new File(fullPath);   
          19.         int flag = 0;   
          20.         if(handler == null)   
          21.             return "failure";   
          22.         if(fileName == null)   
          23.             return "failure";   
          24.            
          25.         try {   
          26.             InputStream input = handler.getInputStream();   
          27.             FileOutputStream fos = new FileOutputStream(file);   
          28.             byte[] buffer=new byte[4096];   
          29.             while((flag=input.read(buffer))!=-1){   
          30.                 fos.write(buffer,0,flag);   
          31.             }   
          32.             input.close();   
          33.             fos.close();   
          34.         } catch (IOException e) {   
          35.             e.printStackTrace();   
          36.             return "failure";   
          37.         }   
          38.         return "Success";   
          39.     }   
          40. }  

           

          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ā)布文件。

           

          Xml代碼 復(fù)制代碼
          1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"    
          2.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
          3.        
          4.     <service name="FileTransfer" provider="java:RPC">  
          5.         <parameter name="className" value="com.chnic.webservice.FileTransfer"/>  
          6.         <parameter name="allowedMethods" value="transfer"/>  
          7.         <parameter name="scope" value="session"/>  
          8.            
          9.         <operation name="transfer"  
          10.                    qname="operNS:transfer"  
          11.                    xmlns:operNS="file"  
          12.                    returnQName="fileSend"    
          13.                    returnType="rtns:string"    
          14.                    xmlns:rtns="http://www.w3.org/2001/XMLSchema">  
          15.                       
          16.             <parameter name="handler" type="tns:string"    
          17.                        xmlns:tns="http://www.w3.org/2001/XMLSchema"/>  
          18.             <parameter name="fileName" type="myns:DataHandler"    
          19.                        xmlns:tns="http://www.w3.org/2001/XMLSchema"/>  
          20.         </operation>  
          21.            
          22.         <typeMapping qname="myns:DataHandler" xmlns:myns="http://fileTransfer.sample"  
          23.           languageSpecificType="java:javax.activation.DataHandler"  
          24.           serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"  
          25.           deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"  
          26.           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>  
          27.     </service>  
          28. </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è)。下面是客戶端代碼。

           

          Java代碼 復(fù)制代碼
          1. String fileName = "C:/sample.txt";   
          2. DataHandler dh=new DataHandler(new FileDataSource(fileName));   
          3. String endpoint="http://localhost:8080/axis/services/FileTransfer";   
          4.   
          5. Service service=new Service();   
          6. Call call=(Call) service.createCall();   
          7. call.setTargetEndpointAddress(new java.net.URL(endpoint));   
          8. call.setOperationName(new QName(endpoint, "transfer"));   
          9. QName qnameattachment=new QName("http://fileTransfer.sample",   
          10.         "myns:DataHandler");   
          11.   
          12. call.registerTypeMapping(dh.getClass(),   
          13.         qnameattachment,   
          14.         JAFDataHandlerSerializerFactory.class,   
          15.         JAFDataHandlerDeserializerFactory.class);   
          16.   
          17. call.addParameter("s1",qnameattachment,ParameterMode.IN);   
          18. call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);   
          19. call.setReturnClass(String.class);   
          20. String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"});   
          21. System.out.println("transfer success....");   
          22. 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è)文件。

           

           

           

           

           

           

          評(píng)論
          4 樓 lansetianji2008 2008-12-18   引用
          如果遇到大文件要報(bào)堆棧錯(cuò)誤的,請(qǐng)問樓主怎么解決呢?
          3 樓 hcqenjoy 2008-11-27   引用
          DataHandler  對(duì)其他語言 解析不了吧 ?
          2 樓 chnic 2008-05-29   引用
          其實(shí)這里傳文件名有些多余。。
          剛剛查了下JDK 文件名完全可以用DataSource取出來。
          我這篇文章里的這兒demo也是匆匆寫出來的 沒考慮那么多,請(qǐng)見諒。

          至于傳遞多個(gè)文件名字。
          最簡單的方法就是把文件名在客戶端按照規(guī)則做一定處理。比如:
          filename1,filename2,filename3
          一個(gè)String傳到服務(wù)器端 split一下就OK了。
          1 樓 lqxue 2008-05-28   引用
          服務(wù)器端可以直接寫成

          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è)就比較麻煩了。
          posted on 2009-07-03 18:47 super_nini 閱讀(486) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          相冊(cè)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 酉阳| 临洮县| 新蔡县| 湖州市| 固阳县| 大方县| 榆树市| 六枝特区| 阿合奇县| 西青区| 贵溪市| 龙游县| 原阳县| 信宜市| 潍坊市| 辉南县| 荆门市| 滨海县| 涡阳县| 阿拉善盟| 嘉定区| 阿图什市| 金沙县| 湘潭市| 财经| 武隆县| 鄂伦春自治旗| 洛南县| 富顺县| 鸡西市| 万州区| 夏邑县| 留坝县| 柳河县| 新泰市| 丰顺县| 大竹县| 大化| 和顺县| 苏尼特右旗| 遵义市|