<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

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

     

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

     

    這個(gè)方法從DataHandler得到一個(gè)輸入流,從這個(gè)流里讀出數(shù)據(jù)然后寫(xiě)到一個(gè)新文件里。這些都是一些基本的Java I/O操作。應(yīng)該不會(huì)太難。服務(wù)器代碼編寫(xiě)完之后下來(lái)是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è)工廠類。編寫(xiě)完一切,啟動(dòng)tomcat然后發(fā)布服務(wù)。

     

    服務(wù)器端的代碼已經(jīng)編寫(xiě)完成了,現(xiàn)在輪到客戶端代碼。因?yàn)槭莻€(gè)簡(jiǎn)單的sample,所以做的事情也比較簡(jiǎn)單就是把C盤(pán)根目錄上的一個(gè)文件通過(guò)webwervice儲(chǔ)存到C盤(pán),當(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);  

     

    客戶端通過(guò)DataHandler取得源文件,之后注冊(cè)DataHandler,注冊(cè)兩個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)。之后傳入相關(guān)的參數(shù)。新文件也在C盤(pán)下面名字為aaaaa.txt。運(yùn)行測(cè)試代,控制臺(tái)打出兩句話。

    transfer success....
    Success

     

    說(shuō)明測(cè)試成功,到C盤(pán)上也可以找到aaaaa.txt這個(gè)文件。

     

     

     

     

     

     

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

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

    FileOutputStream os;
    try {
    os = new FileOutputStream(filename);
    handler.writeTo(os);
    } catch (Exception e) {
    e.printStackTrace();
    }

    我有個(gè)疑問(wèn),如果不通過(guò)這種方式傳filename,我們有沒(méi)有其他方式來(lái)傳filename,因?yàn)槿绻胪瑫r(shí)傳多個(gè)文件的時(shí)候,這個(gè)就比較麻煩了。
    posted on 2009-07-03 18:47 super_nini 閱讀(485) 評(píng)論(0)  編輯  收藏

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


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

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 新最免费影视大全在线播放| 色欲aⅴ亚洲情无码AV蜜桃| 永久免费av无码入口国语片| 亚洲国产高清在线一区二区三区| 亚洲男人的天堂网站| 18禁无遮挡无码网站免费| 亚洲综合在线一区二区三区| 成视频年人黄网站免费视频| 亚洲五月丁香综合视频| AV无码免费永久在线观看| 中国china体内裑精亚洲日本| 中国在线观看免费国语版| 亚洲中文字幕无码中文字| 午夜dj免费在线观看| 免费亚洲视频在线观看| 亚洲美女在线国产| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 综合亚洲伊人午夜网| 99久久成人国产精品免费| 亚洲成年人在线观看| AV大片在线无码永久免费| 亚洲欧美国产日韩av野草社区| 尤物永久免费AV无码网站| eeuss影院ss奇兵免费com| 久久亚洲精品视频| 日本妇人成熟免费中文字幕| 亚洲欧洲AV无码专区| 亚洲一区二区三区免费| 久久免费观看国产精品| 亚洲欧洲日本在线观看| www国产亚洲精品久久久| 日韩电影免费在线观看中文字幕| 亚洲精品无码久久久久久久| 国产精品深夜福利免费观看| 国产精品午夜免费观看网站| 亚洲精品美女久久久久| 日本特黄特色aa大片免费| 中国好声音第二季免费播放| 亚洲一级毛片免费在线观看| 亚洲无线一二三四区手机| 午夜性色一区二区三区免费不卡视频 |