WebService(4)-AXIS高级特性 传送文件

来源:互联网 发布:炒股用什么软件 编辑:程序博客网 时间:2024/05/24 04:29

文件主要是用到一个DataHandler类,这是一个专门的传送器,可以把文件序列化。然后从传送器中得到一个输入流,从这个输入流中读出数据就是我们从客户端传过来的文件了。

 

eg:从客户端传送一个文件到服务器去
(1) WebService服务器端方法、
public String transfer(DataHandler handler,String fileName){
  File file = new File(fileName);
  int flag = 0;
  if(handler==null || fileName == null || "".equals(fileName)){
   return "failure";
  }
  InputStream input = null;
  FileOutputStream fos = null;
  try {
   input = handler.getInputStream();
   fos = new FileOutputStream(file);
   byte[] buffer = new byte[1024];
   while (input.read(buffer)!=-1){
    fos.write(buffer);
   }
  } catch(Exception ex){
   ex.printStackTrace();
  } finally{
   if(input !=null){
    try {
     input.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if(fos !=null) {
    try {
     fos.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  return "file trasfer success"+file.getAbsolutePath();
 }

 


(2) server-config.wsdd文件配置
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <handler name="URLMapper"
  type="java:org.apache.axis.handlers.http.URLMapper" />
 <handler name="wsTestHandler"
  type="java:cn.com.chenlly.ssh.webservice.axis.WSTestServiceHandle">
  <parameter name="status" value="success" />
 </handler>
 <!-- 自定义服务 -->
 <service name="ws" provider="java:RPC">
  <parameter name="className"
   value="cn.com.chenlly.ssh.webservice.axis.WSTestServiceImpl" />
  <parameter name="allowedMethods" value="*" />
  <parameter name="scope" value="request" />

  <responseFlow>
   <handler type="wsTestHandler" />
  </responseFlow>

  <requestFlow>
   <handler type="wsTestHandler" />
  </requestFlow>
  <!-- 传送复杂对象 -->
  <beanMapping qname="myNSD:Address"
   xmlns:myNSD="urn:AddressManager"
   languageSpecificType="java:cn.com.chenlly.ssh.webservice.axis.Address">
  </beanMapping>
  <!-- 文件传输配置 -->
  <operation  name="transfer"
     qname="operNS:transfer"
     xmlns:operNS="file"
     returnQName="fileSend"
     returnType="rtns:string"
     xmlns:rtns="http://www.w3.org/2001/XMLSchema">
     <parameter name="handler" type="tns:string"
      xmlns:tns="http://www.w3.org/2001/XMLSchema" />
     <parameter name="fileName" type="myns:DataHandler"
      xmlns:tns="http://www.w3.org/2001/XMLSchema" />
  </operation>
   <typeMapping qname="myns:DataHandler" xmlns:myns="http://fileTransfer.sample" 
          languageSpecificType="java:javax.activation.DataHandler" 
           serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" 
           deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" 
           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
 </service>

 <transport name="http">
  <requestFlow>
   <handler type="URLMapper" />
  </requestFlow>
 </transport>
</deployment>
注意:可以通过使用<operation>标签指定关于服务的特殊操作的元数据。这可以将方法的java参数名和特定的XML名进行映射,
为参数指定特定的模式,并将特定的XML名字映射到特定的操作。例如
<operation name="method">
</operation>

 

(3) 客户端
public class WSTestServiceClient {
 public static void main(String[] args) {
  Service service = new Service();
  try {
   //把客户端c 盘下的一个文件通过webService保存到服务器上去
   String fileName = "D:/sample.txt"; 
   DataHandler dh=new DataHandler(new FileDataSource(fileName));
   Call call = (Call) service.createCall();
   String url = "http://192.168.1.98:8082/SSHProject/services/ws?wsdl";
   call.setTargetEndpointAddress(new java.net.URL(url));
   call.setOperationName(new QName(url,"transfer"));
   QName qn=new QName("http://fileTransfer.sample", "DataHandler");  
   call.registerTypeMapping(dh.getClass(), qn,JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);  
   call.addParameter("s1",qn,ParameterMode.IN);  
   call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);  
   call.setReturnClass(String.class);  
   String ret=(String)call.invoke(new Object[] {dh,"d:/service.txt"});  
   System.out.println("transfer success....");  
   System.out.println(ret); 
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

原创粉丝点击