webservice+axis文件传递

今天来介绍一下如何利用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. }  
package com.chnic.webservice;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.activation.DataHandler;

public class FileTransfer {

 public FileTransfer(){
  
 }
 
 public String transfer(DataHandler handler, String fileName){
  String fullPath = "C:/" + fileName;
  File file = new File(fullPath);
  int flag = 0;
  if(handler == null)
   return "failure";
  if(fileName == null)
   return "failure";
  
  try {
   InputStream input = handler.getInputStream();
   FileOutputStream fos = new FileOutputStream(file);
   byte[] buffer=new byte[4096];
   while((flag=input.read(buffer))!=-1){
    fos.write(buffer,0,flag);
   }
   input.close();
   fos.close();
  } catch (IOException e) {
   e.printStackTrace();
   return "failure";
  }
  return "Success";
 }
}

 

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);  
String fileName = "C:/sample.txt";
  DataHandler dh=new DataHandler(new FileDataSource(fileName));
  String endpoint="http://localhost:8080/axis/services/FileTransfer";
  
  Service service=new Service();
  Call call=(Call) service.createCall();
  call.setTargetEndpointAddress(new java.net.URL(endpoint));
  call.setOperationName(new QName(endpoint, "transfer"));
  QName qnameattachment=new QName("http://fileTransfer.sample",
    "myns:DataHandler");
  
  call.registerTypeMapping(dh.getClass(),
    qnameattachment,
    JAFDataHandlerSerializerFactory.class,
    JAFDataHandlerDeserializerFactory.class);
  
  call.addParameter("s1",qnameattachment,ParameterMode.IN);
  call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);
  call.setReturnClass(String.class);
  String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"});
  System.out.println("transfer success....");
  System.out.println(ret);

 

客户端通过DataHandler取得源文件,之后注册DataHandler,注册两个输入参数和一个输出参数。之后传入相关的参数。新文件也在C盘下面名字为aaaaa.txt。运行测试代,控制台打出两句话。

transfer success....
Success

 

说明测试成功,到C盘上也可以找到aaaaa.txt这个文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值