微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

webservice+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这个文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐