posts - 64,  comments - 9,  trackbacks - 0

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

           

          直入主題,我們先來編寫服務(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端接受客戶端傳來文件的方法,方法里面有兩個參數(shù),第一個是DataHandler。這個類可以看成是一個傳送器,通過專門的序列化類將文件序列化。這個類的具體方法可以查一下SUN的API文檔。第二個參數(shù)是一個String字符串,參數(shù)名就可以看出來,傳遞的是文件名。

           

          這個方法從DataHandler得到一個輸入流,從這個流里讀出數(shù)據(jù)然后寫到一個新文件里。這些都是一些基本的Java I/O操作。應(yīng)該不會太難。服務(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>  

           

          這個配置文件也不多介紹了,前幾篇關(guān)于這幾個元素的介紹已經(jīng)比較清楚了,在這里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 這個類。前面序列化對象的時候提到序列化不同對象的時候需要不同的工廠類,同樣在序列化文件的時候就要用這個工廠類。編寫完一切,啟動tomcat然后發(fā)布服務(wù)。

           

          服務(wù)器端的代碼已經(jīng)編寫完成了,現(xiàn)在輪到客戶端代碼。因為是個簡單的sample,所以做的事情也比較簡單就是把C盤根目錄上的一個文件通過webwervice儲存到C盤,當(dāng)然文件名要用另外一個。下面是客戶端代碼。

           

          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取得源文件,之后注冊DataHandler,注冊兩個輸入?yún)?shù)和一個輸出參數(shù)。之后傳入相關(guān)的參數(shù)。新文件也在C盤下面名字為aaaaa.txt。運行測試代,控制臺打出兩句話。

          transfer success....
          Success

           

          說明測試成功,到C盤上也可以找到aaaaa.txt這個文件。

           

           

           

           

           

           

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

          至于傳遞多個文件名字。
          最簡單的方法就是把文件名在客戶端按照規(guī)則做一定處理。比如:
          filename1,filename2,filename3
          一個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();
          }

          我有個疑問,如果不通過這種方式傳filename,我們有沒有其他方式來傳filename,因為如果想同時傳多個文件的時候,這個就比較麻煩了。
          posted on 2009-07-03 18:47 super_nini 閱讀(480) 評論(0)  編輯  收藏

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


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

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 连州市| 乐至县| 息烽县| 河池市| 原阳县| 南和县| 兴山县| 东光县| 阜新市| 东乌珠穆沁旗| 交城县| 诸城市| 望城县| 正宁县| 宜君县| 河池市| 黑水县| 衡阳县| 滁州市| 土默特右旗| 莱芜市| 五常市| 延川县| 烟台市| 湾仔区| 怀集县| 无极县| 汨罗市| 石楼县| 韶关市| 尖扎县| 嫩江县| 竹溪县| 织金县| 囊谦县| 南涧| 襄垣县| 苏尼特右旗| 霍城县| 界首市| 石狮市|