<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,  comments - 9,  trackbacks - 0

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

     

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

    Java代碼 復制代碼
    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端接受客戶端傳來文件的方法,方法里面有兩個參數,第一個是DataHandler。這個類可以看成是一個傳送器,通過專門的序列化類將文件序列化。這個類的具體方法可以查一下SUN的API文檔。第二個參數是一個String字符串,參數名就可以看出來,傳遞的是文件名。

     

    這個方法從DataHandler得到一個輸入流,從這個流里讀出數據然后寫到一個新文件里。這些都是一些基本的Java I/O操作。應該不會太難。服務器代碼編寫完之后下來是deploy.wsdd發布文件。

     

    Xml代碼 復制代碼
    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>  

     

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

     

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

     

    Java代碼 復制代碼
    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,注冊兩個輸入參數和一個輸出參數。之后傳入相關的參數。新文件也在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也是匆匆寫出來的 沒考慮那么多,請見諒。

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

    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 閱讀(478) 評論(0)  編輯  收藏

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


    網站導航:
     
    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲2022国产成人精品无码区| 四虎影视精品永久免费| 久久精品国产69国产精品亚洲| 一级女性全黄久久生活片免费| 麻豆国产VA免费精品高清在线| 亚洲人成人伊人成综合网无码| 毛片高清视频在线看免费观看| 亚洲AV无码乱码在线观看代蜜桃| 永久免费在线观看视频| 亚洲一级片在线播放| 久久久久久99av无码免费网站| 亚洲色成人WWW永久在线观看| 全免费A级毛片免费看网站| 亚洲国产无线乱码在线观看| 四虎免费久久影院| 午夜成人无码福利免费视频| 亚洲欧洲∨国产一区二区三区| 日本免费在线中文字幕| 亚洲日本乱码一区二区在线二产线 | 国产精品亚洲一区二区三区久久| 在线免费观看国产视频| 深夜A级毛片视频免费| 国产亚洲精品拍拍拍拍拍| aa级毛片毛片免费观看久| 亚洲天天在线日亚洲洲精| 真人做A免费观看| 亚洲αⅴ无码乱码在线观看性色| 亚洲精品天堂成人片?V在线播放| a级毛片高清免费视频就| 青青草原精品国产亚洲av| 永久免费的网站在线观看| 视频一区在线免费观看| 久久被窝电影亚洲爽爽爽| 一二三四影视在线看片免费| 无人视频在线观看免费播放影院| 亚洲桃色AV无码| 成人毛片免费观看| 国产午夜精品理论片免费观看| 亚洲网站视频在线观看| 国产精品极品美女免费观看| 精品一卡2卡三卡4卡免费视频|