`
chnic
  • 浏览: 227721 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用AXIS开发Webservice(五) —— 如何传递文件

阅读更多

趁着放假来更新一下博客,今天来介绍一下如何利用AXIS来传递文件。因为这已经是关于AXIS的第五篇文章了,所以讲的会比较快,有不明白的朋友可以翻翻前面的文章来参考一下。

 

直入主题,我们先来编写服务器代码

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发布文件。

 

<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    
    <service name="FileTransfer" provider="java:RPC">
        <parameter name="className" value="com.chnic.webservice.FileTransfer"/>
        <parameter name="allowedMethods" value="transfer"/>
        <parameter name="scope" value="session"/>
        
        <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>
</deployment>

 

这个配置文件也不多介绍了,前几篇关于这几个元素的介绍已经比较清楚了,在这里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 这个类。前面序列化对象的时候提到序列化不同对象的时候需要不同的工厂类,同样在序列化文件的时候就要用这个工厂类。编写完一切,启动tomcat然后发布服务。

 

服务器端的代码已经编写完成了,现在轮到客户端代码。因为是个简单的sample,所以做的事情也比较简单就是把C盘根目录上的一个文件通过webwervice储存到C盘,当然文件名要用另外一个。下面是客户端代码。

 

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

 

 

 

 

 

 

分享到:
评论
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,因为如果想同时传多个文件的时候,这个就比较麻烦了。

相关推荐

    Axis开发WebService实例.pdf

    ### Axis开发WebService实例知识点解析 #### 一、Axis概述与安装配置 - **Apache Axis简介**:Apache Axis是Apache组织提供的一个开源项目,用于在Java环境中实现WebService技术规范。它支持SOAP协议,并提供了...

    WebService------AXIS

    WebService——AXIS详解 在IT领域,WebService是一种基于标准的、平台无关的、可以在不同系统之间交换数据的方式。它利用XML(可扩展标记语言)作为数据格式,HTTP作为传输协议,SOAP(简单对象访问协议)作为消息...

    webservice学习二之(1)axis2服务器端方式开发总结(附件含有项目)

    【标题】:Web服务接口(WebService)学习二之(1)——Axis2服务器端开发总结 在本文中,我们将深入探讨使用Apache Axis2框架进行Web服务(WebService)服务器端开发的相关知识点。Apache Axis2是Java平台上一个高效...

    webServices学习之一——axis1实现helloWorld

    Axis1利用SOAP协议,使得开发者能够方便地创建、发布和调用Web服务。 创建"Hello, World!" Web服务的第一步是编写Java代码。我们需要一个简单的Java类,该类包含一个公共方法,例如`sayHello()`,该方法返回字符串...

    Axis2从入门到精通--Webservice在eclipse下开发教程

    本教程将逐步指导你如何利用Axis2在Eclipse环境中创建、部署和调用一个无需任何配置文件的Web服务,并展示如何在Java和C#客户端中使用这些服务。 首先,了解Axis2的基本特性: 1. **支持多种协议**:Axis2不仅支持...

    搭建Axis WebService

    本教程将深入探讨如何利用Axis搭建Web服务,以及相关的知识点。 首先,我们需要了解Web服务的基本概念。Web服务是基于开放标准(如HTTP、XML和WSDL)的,能够通过互联网进行交互的软件。它们提供了一种标准化的方式...

    MyEclipse下开发Web Service(Axis)

    接下来,通过一个简单实例——SayHello服务,了解使用Axis开发Web Service的全流程。 **2.1 WSDL编写** - 在MyEclipse中创建一个Web Project,命名为`SayHello`。 - 通过`File -&gt; New -&gt; Other -&gt; MyEclipse -&gt; ...

    WebService大讲堂之Axis2.pdf

    - **文件选择**:提供两种主要的安装包——`axis2-1.4.1-bin.zip`和`axis2-1.4.1-war.zip`。前者包含了所有必要的JAR文件;后者则用于在Web容器中部署Web服务。 - **安装步骤**:解压缩`.war`文件至Tomcat或其他Web...

    axis2教程word文件

    在Axis2中,开发者可以利用简单的POJO(Plain Old Java Object)创建无须额外配置的WebService。这种模式极大地简化了开发流程,提高了效率。例如,一个包含业务逻辑的Java类可以直接暴露为WebService,无需复杂的...

    axis2资源压缩包

    描述中提到,“axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice”,这进一步证实了Axis2的核心功能——作为Web服务的发布平台。通过Axis2,开发者可以轻松地将Java方法暴露为Web服务,或者...

    webservice for idea

    ### 使用Apache Axis开发WebService #### 创建项目结构 1. **打开IntelliJ IDEA** 并选择 **新建项目**。 2. 按照提示逐步设置项目基本信息及项目类型为 **Web Application** 和 **Web Services**。 3. 选择 **...

    axis2-1.7.7-bin所有jar包

    描述中提到的"下载axis2-1.7.4-bin.zip,lib目录下的jar包是WebService业务开发需要的库文件",这意味着在解压后的zip文件中,`lib`目录包含了一系列必要的jar文件,这些文件对于进行基于Axis2的Web服务开发至关重要...

    JAVA之WEB服务开发方法论图解.pdf

    在Java上开发Web服务(简称WebService)的技术不断涌现,其中Apache软件基金会的两个重要子项目——Axis2和CXF,成为了实现Web服务的重要技术框架。本文将通过图文并茂的方式,详细阐述使用Axis2或CXF进行Web服务...

    neethi-3.0.2包文件.rar

    今天,我们将深入探讨一个与Java Web服务紧密相关的组件——neethi-3.0.2包文件,以及它如何在实际项目中发挥作用。 首先,让我们明确一下“neethi”是什么。Neethi,全称为“NetBeans Entity Transformer for WSDL...

Global site tag (gtag.js) - Google Analytics